这可能是一个奇怪的问题。目前,我有一张表,里面有一堆数据。使用 PHP,我正在动态创建 IN 子句。
SELECT * FROM table
WHERE field IN ('str1', 'str2', [...])
假设没有与“str1”或“str2”匹配的记录,有没有办法检索“str1”和“str2”?
SELECT dmy.id
FROM (
SELECT 'str1' as id
UNION ALL
SELECT 'str2'
UNION ALL
.....
) dmy
LEFT JOIN some_table ON some_table.field = dmy.id
WHERE some_table.field IS NULL
如有特殊要求,以下是解释:
派生表(内部选择)只是创建一个包含所有所需值的“虚拟”表。然后这个虚拟表外部连接到真实表。外部连接表 (some_table) 中没有值 (NULL) 的任何内容都不存在于虚拟“表”的值列表中。
要查看派生表的效果,只需在没有连接的情况下单独运行它:
SELECT dmy.id
FROM (
SELECT 'str1' as id
UNION ALL
SELECT 'str2'
UNION ALL
.....
) dmy
在动态构建查询时,将 str 值记录在数组中。然后,当您运行查询并检查结果数量时,如果没有结果,您可以对字符串数组做任何您需要做的事情(我猜您想在某处记录它)。
或者干脆
SELECT field from table WHERE field IN ( .. ) GROUP BY field;
这将返回一个 1 数组,该数组包含在至少有一个匹配项的值列表中。然后很容易通过将初始列表与获得的数组进行比较来找出不匹配的值