簡體   English   中英

從where子句的給定集中選擇表中不存在的ID

[英]Select IDs that do not exist in a table from a given set in where clause

我有一組userID: (512,5,13,14,67)和一個包含以下內容的表:

+----+--------+
| Id | userID |
+----+--------+
|  1 |    512 |
|  2 |     13 |
|  3 |     14 |
|  4 |     51 |
|  5 |      6 |
+----+--------+

集合中的某些用戶ID在表中不存在。 例如,userID 5和userID 64不存在。

當我Select * from mytable where userID NOT IN (512,5,13,14,67)執行Select * from mytable where userID NOT IN (512,5,13,14,67) ,它將顯示具有用戶ID 651的行

+----+--------+
| Id | userID |
+----+--------+
|  4 |     51 |
|  5 |      6 |
+----+--------+

我想做類似的事情:
SELECT userID FROM my TABLE WHERE NOT EXISTS IN (1,5,10,15)

並得到以下結果:

+-------+--------+
|  Id   | userID |
+-------+--------+
| NULL  |      5 |
| NULL  |     64 |
+-------+--------+

我的表包含一百萬行,搜索集可能包含1000個要搜索的ID。

如果我正確理解您的問題,那么您正在尋找。

SELECT 
   NULL AS id 
 , search_filter.userID
FROM (
  SELECT 
   5 AS userID
  UNION
  SELECT
    64 AS userID
  # [...]
) AS search_filter
LEFT JOIN
 your_table
ON
 search_filter.userID = your_table.userID
WHERE 
 your_table.userID IS NULL

搜索集可能是1000個ID,所以我無法像這樣執行查詢。

然后,使用將由嵌套SUBSTRING_INDEX()函數解析的CSV搜索列表與SQL數字生成器結合使用是您唯一的也是最佳選擇。

SELECT 
   NULL AS id 
 , search_filter.userID
FROM (
  SELECT 
   DISTINCT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(init_search.search_list, ',', sql_number_generator.number), ',', -1
    ) AS userID
FROM (

SELECT
  @number := @number + 1 AS number
FROM (
  (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) row1
  CROSS JOIN
  (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) row2
  CROSS JOIN
  (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) row3 
  CROSS JOIN
  (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) row4    
  CROSS JOIN 
  (SELECT @number:=0) AS init_user_params
)  
) AS sql_number_generator
CROSS JOIN (
 SElECT '512,5,13,14,67' AS search_list 
) AS init_search
) AS search_filter
LEFT JOIN
 your_table
ON
 search_filter.userID = your_table.userID
WHERE 
 your_table.userID IS NULL

結果

| id  | userID |
| --- | ------ |
|     | 5      |
|     | 67     |

觀看演示

暫無
暫無

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

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