我正在尝试编写一个SQL查询来查找两个人是否在同一天去了同一个地方。
例如,如果John在2018年3月15日、2018年2月10日和2018年3月1日去了沃尔玛,如果Doe在同一天去了沃尔玛,结果就会显示出来。
但是如果Doe在2018年3月15日去了沃尔玛,2018年10月2日去了沃尔玛,而不是2018年3月1日去了沃尔玛,那么就不要显示这个记录。
下面是表的模式。visitation (username, name, place, date);
john, John, Walmart, '15/03/2018'
john, John, Walmart, '10/02/2018'
john, John, Walmart, '03/01/2018'
doe, Doe, Walmart, '15/03/2018'
doe, Doe, Walmart, '10/02/2018'
doe, Doe, BestBuy, '11/13/2018'上面的输出应该是零。
我知道我必须在地点和日期自行加入,用户名不等于username2,但我如何检查第二个人是否在同一天和另一个人去了同一个地方?
任何帮助都是最好的。
发布于 2018-03-16 11:18:58
首先,您可能应该考虑使用关联表。您的表中似乎有许多重复的数据,这很容易导致混淆(如果您插入"Jonh“而不是"John”,它将无法将其识别为同一个人!)。
因此,您应该有一个用于users的表和一个用于places的表,以及一个额外的关联表,用于连接这两个表:
visitations(user_id, place_id, date)因此,通过使用外键约束,您可以轻松地查询关系并获得所需的联接。
发布于 2018-03-16 11:23:43
如果你事先知道你想要比较的两个用户,这样的方法是可行的。
SELECT * FROM visitation AS v1
JOIN visitation v2 ON v1.place = v2.place
AND v1.visitdate = v2.visitdate
WHERE v1.username='john' AND v2.username = 'joe';这实际上是一个交集,这是MySQL不支持的。
Sql Fiddle
发布于 2018-03-16 13:26:51
如果我理解正确的话,您应该先进行简单的聚合,然后再过滤记录
SELECT * FROM visitation
WHERE place NOT IN (
SELECT place
FROM visitation
GROUP BY place, visitdate
HAVING COUNT(distinct username) = 1))https://stackoverflow.com/questions/49312586
复制相似问题