MySQL - Where IN 查询中的匹配和不匹配结果

Posted

技术标签:

【中文标题】MySQL - Where IN 查询中的匹配和不匹配结果【英文标题】:MySQL - matching and non-matching results in Where IN query 【发布时间】:2019-01-18 11:49:31 【问题描述】:

我需要根据用户输入的关键字从数据库中找到匹配和不匹配的关键字。

下面是我们存储所有已知关键字的数据库架构

Table keywords
   keyword varchar

简单地找到匹配的关键字。我们使用以下查询来查找匹配的关键字

select keyword from keywords where keyword in ('abc', 'pqr', 'xyz')

其中“abc”、“pqr”、“xyz”是用户提供的关键字。

但是,我还需要找到数据库中不存在的关键字。绝对NOT IN 不起作用,因为它将返回数据库中的所有标签,而不是不匹配的标签。例如,如果数据库中存在“abc”和“pqr”而“xyz”不存在,我期望输出如下

keyword present
abc       1
pqr       1
xyz       0

请帮帮我。

【问题讨论】:

【参考方案1】:

您可以在下面尝试 - 使用 cte

with cte1 as 
(
select 'abc' as key
union 
select 'pqr' union select 'xyz' 
)
select keyword,case when key is null then 0 else 1 end as is_present 
from keywords left join cte1 on keyword=key

【讨论】:

有一个错误,但我明白了。我接受作为答案。【参考方案2】:

选择三个关键字并使用子查询在关键字表中查找它们:

select
  keyword,
  keyword in (select keyword from keywords) as present
from
(
  select 'abc' as keyword
  union all
  select 'pqr' as keyword
  union all
  select 'xyz' as keyword
) user_keywords
order by keyword;

【讨论】:

以上是关于MySQL - Where IN 查询中的匹配和不匹配结果的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 多表where查询与单表select where in哪一个效率高

MYSQL 查询不适用于 where 或 FIND_IN_SET 中的希腊词

7_mysql查询之where子句

警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱

MySQL - WHERE 子句中的 NOT IN 查询具有相同的结构,适用于第一个表但不适用于第二个表

mysql子查询在where in子句中