mysql 数据库怎么对同一个表进行笛卡儿积

2018-06-07 21:51:48 +08:00
 stevenbipt

需要查询一个数据库中同一个人干了不同的两个事,比如:开运动会时一个人同时参加了 400 米和 800 米项目,怎么把这个人查询出来(即同时参加了 400 米和 800 米的人名),刚学 MYSQL 碰到了这个问题,个人想的是做笛卡儿积然后使名字相同,第一个项目为 400 米,第二个项目为 800 米,但是这样查不出来。

3410 次点击
所在节点    MySQL
10 条回复
yangqi
2018-06-07 21:57:52 +08:00
表结构不说?看看 group by
stevenbipt
2018-06-07 22:00:14 +08:00
字段名 数据类型 含义
1 sNo char(5) 运动员编号
2 eNo tinyint unsigned 项目编号
3 result varchar(50) 成绩
4 ranking tinyint unsigned 名次
5 score tinyint unsigned 分数
查询同时参加项目 5 和项目 6 的运动员编号。
@yangqi
zhzsh
2018-06-07 22:03:54 +08:00
select sno, count(1) cnt from table where eno in (5,6) group by sno having cnt=2 这样可以吗
stevenbipt
2018-06-07 22:06:31 +08:00
@zhzsh 成功了但是原理是什么呢?
zhzsh
2018-06-07 22:12:55 +08:00
@stevenbipt 先用 where 过滤掉非 5 或 6 的项目然后 groupby 运动员算过滤后每个人参加的项目数然后再选出项目数=2 的运动员 也就是参加了 5 和 6 两项
yangqi
2018-06-07 22:14:41 +08:00
是要查询所有参加了多个项目的人?如果是的话
select from group by sNo having count(eNo) > 1
stevenbipt
2018-06-07 22:24:33 +08:00
@yangqi 不是,就是参加了指定的两个项目(项目 5 和项目 6 的人)
yangqi
2018-06-07 22:29:38 +08:00
@stevenbipt #7 那就加个 where 就行了,反正就是用 group by having count()
msg7086
2018-06-08 00:20:38 +08:00
XY 问题。
原题是从一张表中查出两条记录(也就是 WHERE eNo in (5, 6))。
然后判断一个人是否同时有这两条数据(也就是 GROUP BY sNo HAVING COUNT(eNo) = 2 )。
tradzero
2018-06-08 09:19:00 +08:00
union all

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/461331

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX