[英]MYSQL many-to-many selection with AND condition
我在 stackoverflow 中发现了一个类似的问题,但这并不是我现在面临的问题。 我找不到比以下更好的方法来描述所需的查询:
选择至少具有属性一 AND 属性二 AND ... 的所有条目
考虑以下表格:
用户
| id | name |
+------+--------+
| 1 | john |
+------+--------+
| 2 | liu |
+------+--------+
运动的
| id | user_id | sport |
+------+-----------+------------+
| 1 | 1 | swim |
+------+-----------+------------+
| 2 | 1 | run |
+------+-----------+------------+
| 3 | 1 | football |
+------+-----------+------------+
| 4 | 1 | volley |
+------+-----------+------------+
| 5 | 2 | swim |
+------+-----------+------------+
| 6 | 2 | run |
+------+-----------+------------+
我希望能够进行以下查询:
返回:
| id | name |
+------+--------+
| 1 | john |
+------+--------+
| 2 | liu |
+------+--------+
返回:
| id | name |
+------+--------+
| 1 | john |
+------+--------+
| 2 | liu |
+------+--------+
返回:
| id | name |
+------+--------+
| 1 | john |
+------+--------+
运动的数量应该是动态的。
谢谢你。
列表中的项目数量不能真正是“动态的”,至少不能超过任何值列表。
SELECT u.id, u.name
FROM users AS u
INNER JOIN sports AS s ON s.user_id = u.id
WHERE s.sport IN ('football','run','swim')
GROUP B u.id, u.name
HAVING COUNT(DISTINCT sport) = 3
;
对于更长/更短的列表,您只需要相应地调整3
。
要检查所有 3 个你可以做的
select u.id, u.name
from users u
join sports s on s.user_id = u.id
group by u.id, u.name
having sum(sport = 'swim') > 0
and sum(sport = 'run') > 0
and sum(sport = 'football') > 0
从查询中删除其他选择不需要的那些。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.