![](/img/trans.png)
[英]MySQL select from two table based on multiple conditions in same table
[英]mysql select from Table A (on conditions) where not in Table B (on same conditions)
我在這件事上玩得很開心。 我一直在閱讀和嘗試不同的解決方案,但沒有一個對我有用。 我創建了一個抽獎系統,需要 select 個滿足所有條件的用戶,之前沒有根據相同條件選擇過。
TableA 字段,用戶已簽到位置:
chID | ceID | cID | crID | clID | user_ID | chTime | chDate
1 1135 1001 1001 1163 8213451 17:21:30 2022-04-21
2 1135 1001 1001 1163 8213452 17:22:30 2022-04-21
3 1135 1001 1001 1163 8213453 17:23:30 2022-04-21
4 1135 1001 1001 1163 8213454 17:24:30 2022-04-21
5 1135 1001 1001 1163 8213455 17:25:30 2022-04-21
6 1155 1021 1001 1183 9213451 17:21:30 2022-04-21
7 1155 1021 1001 1183 9213452 17:22:30 2022-04-21
8 1155 1021 1001 1183 9213453 17:23:30 2022-04-21
9 1155 1021 1001 1183 9213454 17:24:30 2022-04-21
10 1155 1021 1001 1183 9213455 17:25:30 2022-04-21
11 1136 1002 1001 2163 8213451 17:21:30 2022-04-21
12 1136 1002 1001 2163 8213452 17:22:30 2022-04-21
13 1136 1002 1001 2163 8213453 17:23:30 2022-04-21
14 1136 1002 1001 2163 8213454 17:24:30 2022-04-21
15 1136 1002 1001 2163 8213455 17:25:30 2022-04-21
注意:1-5 和 11-15 是相同的用戶,但是他們之間的組類別 ID 不同
TableB 字段,用戶之前被選為獲勝者:
bID | ceID | cID | crID | clID | user_ID | chTime | chDate
1 1135 1001 1001 1163 8213451 17:21:30 2022-04-21
2 1155 1021 1001 1183 9213454 17:24:30 2022-04-21
3 1136 1002 1001 2163 8213453 17:23:30 2022-04-21
表 A 存儲已簽入特定組的用戶。 當從該組中選擇一個用戶進行抽獎時,表 B 存儲該用戶。
我需要能夠根據 Table B 中不存在的基於相同組簽入信息的組簽入信息從表 A 中獲取 select。
對於此示例,我需要 select 用戶,其中:ceID=1135、cID=1001、crID=1001、clID=1163 AND chDate=2022-04-21 根據相同的標准,表 B 中不存在該用戶:
// This returns user from wrong group:
select ch.user_ID FROM TableA ch
WHERE NOT EXISTS (
select 1 FROM tableB cr
WHERE ch.cID=1001 AND ch.cID=cr.cID
AND ch.crID=1001 AND ch.crID=cr.crID
AND ch.clID=1163 AND ch.clID=cr.clID
AND ch.ceID=1135 AND ch.ceID=cr.ceID
AND ch.user_ID=cr.user_ID
AND ch.chDate='2022-04-21' AND ch.chDate=cr.chDate
)
Group by ch.user_ID
ORDER BY RAND() LIMIT 1
// This returns nothing:
SELECT ch.* FROM tableA ch
left join tableB cr on ch.user_ID=cr.user_ID
WHERE ch.cID=1001 AND cr.cID=1001
AND ch.crID=1001 AND cr.crID=1001
AND ch.clID=1163 AND cr.clID=1163
AND ch.ceID=1135 AND cr.ceID=1135
AND ch.chDate='2022-04-21' AND cr.chDate='2022-04-21'
AND cr.user_ID IS NULL
GROUP BY ch.user_ID
ORDER BY RAND() LIMIT 1
;
我已經經歷了兩次不同的迭代,但都無濟於事。
我會這樣寫:
SELECT ch.* FROM tableA AS ch
LEFT OUTER JOIN tableB AS cr
ON ch.user_ID=cr.user_ID
AND cr.cID=1001
AND cr.crID=1001
AND cr.clID=1163
AND cr.ceID=1135
AND cr.chDate='2022-04-21'
WHERE ch.cID=1001
AND ch.crID=1001
AND ch.clID=1163
AND ch.ceID=1135
AND ch.chDate='2022-04-21'
AND cr.user_ID IS NULL
GROUP BY ch.user_ID
ORDER BY RAND() LIMIT 1;
如果要在該外連接中將條件放在cr
表上,請將條件放在ON
子句中。 如果將條件放在WHERE
子句中,則意味着列必須為非 NULL,這意味着連接中必須存在匹配項。 但是您正在尋找沒有找到符合這些條件的行來滿足連接的情況。
順便說一句,我不確定GROUP BY
。 除非user_id
是tableA
的主鍵或唯一鍵,否則其他列在功能上不相關,分組應該是錯誤的。 但是如果該列是主鍵或唯一鍵,那么分組就是空操作,所以我不確定它為什么會在那里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.