首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql问题满足并匹配所有记录

sql问题满足并匹配所有记录
EN

Stack Overflow用户
提问于 2018-03-16 11:12:41
回答 3查看 38关注 0票数 0

我正在尝试编写一个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);

代码语言:javascript
复制
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,但我如何检查第二个人是否在同一天和另一个人去了同一个地方?

任何帮助都是最好的。

EN

回答 3

Stack Overflow用户

发布于 2018-03-16 11:18:58

首先,您可能应该考虑使用关联表。您的表中似乎有许多重复的数据,这很容易导致混淆(如果您插入"Jonh“而不是"John”,它将无法将其识别为同一个人!)。

因此,您应该有一个用于users的表和一个用于places的表,以及一个额外的关联表,用于连接这两个表:

代码语言:javascript
复制
visitations(user_id, place_id, date)

因此,通过使用外键约束,您可以轻松地查询关系并获得所需的联接。

票数 0
EN

Stack Overflow用户

发布于 2018-03-16 11:23:43

如果你事先知道你想要比较的两个用户,这样的方法是可行的。

代码语言:javascript
复制
   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

票数 0
EN

Stack Overflow用户

发布于 2018-03-16 13:26:51

如果我理解正确的话,您应该先进行简单的聚合,然后再过滤记录

代码语言:javascript
复制
SELECT * FROM visitation 
 WHERE place NOT IN (
      SELECT place
      FROM visitation
      GROUP BY place, visitdate
      HAVING COUNT(distinct username) = 1))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49312586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档