2012-04-14 62 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/' 

注:这是假定$引用者和$日期没有任何特殊字符的正则表达式!