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