簡體   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