需要查询一个数据库中同一个人干了不同的两个事,比如:开运动会时一个人同时参加了 400 米和 800 米项目,怎么把这个人查询出来(即同时参加了 400 米和 800 米的人名),刚学 MYSQL 碰到了这个问题,个人想的是做笛卡儿积然后使名字相同,第一个项目为 400 米,第二个项目为 800 米,但是这样查不出来。
1
yangqi 2018-06-07 21:57:52 +08:00 1
表结构不说?看看 group by
|
2
stevenbipt OP 字段名 数据类型 含义
1 sNo char(5) 运动员编号 2 eNo tinyint unsigned 项目编号 3 result varchar(50) 成绩 4 ranking tinyint unsigned 名次 5 score tinyint unsigned 分数 查询同时参加项目 5 和项目 6 的运动员编号。 @yangqi |
3
zhzsh 2018-06-07 22:03:54 +08:00 via Android 1
select sno, count(1) cnt from table where eno in (5,6) group by sno having cnt=2 这样可以吗
|
4
stevenbipt OP @zhzsh 成功了但是原理是什么呢?
|
5
zhzsh 2018-06-07 22:12:55 +08:00 via Android 1
@stevenbipt 先用 where 过滤掉非 5 或 6 的项目然后 groupby 运动员算过滤后每个人参加的项目数然后再选出项目数=2 的运动员 也就是参加了 5 和 6 两项
|
6
yangqi 2018-06-07 22:14:41 +08:00 1
是要查询所有参加了多个项目的人?如果是的话
select from group by sNo having count(eNo) > 1 |
7
stevenbipt OP @yangqi 不是,就是参加了指定的两个项目(项目 5 和项目 6 的人)
|
8
yangqi 2018-06-07 22:29:38 +08:00 1
@stevenbipt #7 那就加个 where 就行了,反正就是用 group by having count()
|
9
msg7086 2018-06-08 00:20:38 +08:00 1
XY 问题。
原题是从一张表中查出两条记录(也就是 WHERE eNo in (5, 6))。 然后判断一个人是否同时有这两条数据(也就是 GROUP BY sNo HAVING COUNT(eNo) = 2 )。 |
10
tradzero 2018-06-08 09:19:00 +08:00 via Android
union all
|