2012-04-14 160 views
0

我有一個關於MySQL查詢的問題。我會(顯然)喜歡儘可能少地使用這個查詢,並希望只有一個。我想要做的是更新數據庫中的一列,如果信息不同。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 
"); 

有什麼辦法上班到一個查詢呢?

+0

除了查詢之外,日期不可能相同,時間正在運行! – 2012-04-14 19:48:50

+3

爲什麼你在'referers'和'dates'列中存儲多個值?這是效率低下的,因爲這些列對於具有大量點擊次數的頁面將保持巨大的字符串。這也使得找出特定日期的頂級推薦人或最多點擊的頁面更加困難。 – 2012-04-14 19:50:47

+0

因此,爲每次點擊創建一個新行會更有效率? – Lukas 2012-04-14 20:00:51

回答

1

您應該閱讀有關數據庫規範化的內容。第一個規範化規則是:字段必須是原子的。在你的情況下:不要將多個查閱者/日期保存到用逗號分隔的一個字段中。

+0

謝謝,我會研究它。 – Lukas 2012-04-14 20:29:14

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/' 

注:這是假定$引用者和$日期沒有任何特殊字符的正則表達式!