仅在SELECT不返回任何行时才执行INSERT

时间:2015-07-03 12:27:02

标签: mysql sql

我通过将用户录制到数据库中来跟踪用户访问网站的情况。访问的冷却时间为6小时。出于这个原因,我想仅在用户上次访问当前网站超过6小时前向表visits添加一行。如果上次访问时间不到6小时,则不执行任何操作。

我已经四处寻找答案并发现了很多类似的问题,但这些问题都没有。

这是我试过的最后一次查询:

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附近收到语法错误。

2 个答案:

答案 0 :(得分: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
                     );

答案 1 :(得分: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,没有访问的日期时间,当同一个用户/网站组合有多行时,你如何解释数据,访问结果超过六个小时?