繁体   English   中英

带有AND条件的MYSQL多对多选择

[英]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     |
+------+-----------+------------+

我希望能够进行以下查询:

  1. 选择所有只会游泳的用户(直接)

返回:

|  id  |  name  |
+------+--------+
|  1   |  john  |
+------+--------+
|  2   |  liu   |
+------+--------+
  1. 选择所有会游泳和跑步的用户

返回:

|  id  |  name  |
+------+--------+
|  1   |  john  |
+------+--------+
|  2   |  liu   |
+------+--------+
  1. 选择所有会游泳、跑步和踢足球的用户

返回:

|  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM