我通过将用户录制到数据库中来跟踪用户访问网站的情况。访问的冷却时间为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
附近收到语法错误。
答案 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,没有访问的日期时间,当同一个用户/网站组合有多行时,你如何解释数据,访问结果超过六个小时?