0

MySQL クエリについて質問があります。私は(明らかに)このためにできるだけ少ないクエリを使用したいと思います。できれば 1 つだけです。私がやろうとしているのは、情報が異なる場合にデータベース内の列を更新することです。

たとえば、列「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 つのクエリにまとめる方法はありますか?

4

2 に答える 2

1

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

于 2012-04-14T19:50:33.013 に答える
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/'

注: これは、$referer と $date に特別な正規表現文字がないことを前提としています!

于 2012-04-14T19:57:19.830 に答える