2015-07-03 41 views
2

我通过将用户访问记录到数据库中来跟踪用户对网站的访问。访问的冷却时间为6小时。出于这个原因,我只想在用户上次访问超过6小时前的当前网站时向表visits添加一行。如果上次访问时间少于6小时,则不做任何事情。仅在SELECT返回行时才INSERT

我环顾四周寻找答案,发现很多相当类似的问题,但没有一个为我工作。

这是我最后一次尝试查询:

INSERT INTO visits (user_id, web_id) 
    SELECT (66, 2) FROM websites WHERE NOT EXISTS (
    SELECT 1 FROM visits WHERE web_id = 2 and user_id = 66 and added_on >= NOW() - INTERVAL 6 HOUR 
    ) 

我得到一个语法错误附近WHERE NOT EXISTS

回答

3

您可能希望通过触发器而不是应用程序强制执行此规则。但我认为这个问题是SELECT子句中的括号:

INSERT INTO visits (user_id, web_id) 
    SELECT 66, 2 
    FROM websites 
    WHERE NOT EXISTS (SELECT 1 
         FROM visits 
         WHERE web_id = 2 and user_id = 66 and 
          added_on >= NOW() - INTERVAL 6 HOUR 
        ); 

嗯。 。 。你的查询很奇怪。什么是websites?您的查询将为该表中的每一行插入一行。你想要这种行为似乎不太可能。也许你只是想这样的:

INSERT INTO visits (user_id, web_id) 
    SELECT w.user_id, w.web_id 
    FROM (SELECT 66 as user_id, 2 as web_id) w 
    WHERE NOT EXISTS (SELECT 1 
         FROM visits v 
         WHERE v.web_id = w.web_id and 
          v.user_id = w.user_id and 
          v.added_on >= NOW() - INTERVAL 6 HOUR 
        ); 
+0

是的,它做到了。谢谢。 – Chris

+0

顺便说一句,你能解释一下你的意思吗?用触发器而不是应用程序强制执行规则? – Chris

+0

@Chris。 。 。你可以在表上定义一个'insert'触发器,这样无效的插入会产生一个错误。那么你可以保证桌子符合这些条件。 –

1

你可以试试这个...

INSERT visits (user_id, web_id) 
SELECT distinct user_id, web_id 
FROM websites t join websites b 
    on b.user_id = t.user_id 
     and b.web_id = t.web_id 
     and b.added_on = (Select Max(added_on) From websites 
         Where id = t.user_id 
          and web_id = t.web_id 
          and added_on < t.added_on) 
WHERE t.added_on >= NOW() - INTERVAL 6 HOUR 
    and user_id = 66 
    and web_id = 2 

本身尝试选择部分首先,看它是否返回正确的结果。

顺便说一句,如果你只有访问表中的userId和webId,没有访问的日期时间,当同一用户/网站组合有多行时,你如何解释数据?访问的结果相距超过六个小时?对,

相关问题