![](/img/trans.png)
[英]My SQL - return the rolls/ids from a where clause list which is not exist in table?
[英]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 6
和51
的行
+----+--------+
| 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.