簡體   English   中英

表 A 中的 mysql select(在條件下)不在表 B 中(在相同條件下)

[英]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_idtableA的主鍵或唯一鍵,否則其他列在功能上不相關,分組應該是錯誤的。 但是如果該列是主鍵或唯一鍵,那么分組就是空操作,所以我不確定它為什么會在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM