2012-04-14 8 views
0

MySQLクエリに関する質問があります。私は(明らかに)可能な限り少ない数のクエリを使用したいと思います。うまくいけば1つだけです。私がしようとしているのは、情報が異なる場合、データベースの列を更新することです。フィールドが異なるところのMySQLアップデート

たとえば、「referer」列と「date」列があるとします。ユーザーがリンクをクリックしてリファラーが異なるが日付が同じ場合、リファラー列のみを更新したいと思います。

これが私の現在のクエリです:

mysql_query (" 
    UPDATE clicks 
    SET 
    clicks = clicks + 1 
    , referers = CONCAT(referers, ',$referer') 
    , dates = CONCAT(dates, ',$date') 
    WHERE shortURL = '$url' 
    AND referer != $referer 
"); 

は1つのクエリにこれを動作させる方法はありますか?

+0

クエリとは別に、日付が同じであることは不可能です。時間は実行中です! –

+3

なぜ 'referers'と' dates'カラムに複数の値を格納していますか?これは非効率的です。なぜなら、これらの列は、多数のクリック数を持つページに対して膨大な文字列を保持するからです。また、特定の日付のトップ参照者または最もクリックされたページを把握することを非常に困難にします。 –

+0

クリックごとに新しい行を作成する方が効率的でしょうか? – Lukas

答えて

1

データベースの正規化については、お読みください。 最初の正規化ルールは次のとおりです。フィールドはアトミックでなければなりません。あなたの場合:1つのフィールドにカンマで区切って複数のリファラー/日付を保存しないでください。

+0

ありがとう、私はそれを調べます。 – Lukas

0

私は正規の答えに同意するが、あなたが主張する場合は、CASE文を必要とするように...それが聞こえる:

UPDATE clicks 
SET 
    clicks = clicks + 1 
, referers = CONCAT(referers, ',$referer') 
, dates = 
    CASE 
    WHEN dates REGEXP '/$date/' THEN dates 
    ELSE CONCAT(dates, ',$date') 
    END CASE 
WHERE shortURL = '$url' 
AND referers NOT REGEXP '/$referer/' 

注:これは想定してい$リファラーと$日は特別な正規表現の文字を持っていません!

関連する問題