我有这张桌子。我想选择已经不存在的项目,所以我可以创建它们。
table tags +---------+-------+ | tagId | name | | 1 | C | | 2 | DX | | 3 | CG |
说SQL看起来像:
select name from tags where name in ( 'C', 'CG', 'RX' )
您返回'C'
和'CG'
,因此您知道必须创建'RX'
。
当'RX'
尚不存在时,有没有办法让这样的MySQL语句返回'RX'
?
答案 0 :(得分:4)
假设您的标签('c','cg','rx')位于名为tags_match的表格中,其结构与上述相同
然后你可以这样做:
select tr.name
from tags as tl
right join tags_match as tr
on tl.name = tr.name
where tl.name is null
这会找到tags_match中不在标签中的所有项目,因此这会为您提供所需的结果,但不幸的是您的标签('c','cg','rx')不在表中:(
无论我们可以使用子查询来“伪造”表格
select tr.name
from tags as tl
right join (select 'cg' as name
union select 'c' as name
union select 'rx' as name) as tr
on tl.name = tr.name
where tl.name is null
虽然它有点难看,但这样可行。如果您要测试许多项目,可能需要考虑创建一个真正的临时表。
答案 1 :(得分:1)
当然!的
select name from tags where name not in ( 'C', 'CG', 'RX' )
唯一的问题是,如果not in
列表很长,则此查询会很慢,因为它必须针对每行的'name'
字段检查每个元素,以确定是否它不在列表中,而不是in
,当它匹配时,它将停止在该点检查列表并返回该行。
编辑:上述解决方案有误。我很抱歉。真正的解决方案如下。
以下是在一行SQL中执行此操作的方法:
select name from (
select "C" as name
union select "CG"
union select "RX"
) as foo
where name not in (select name from tags);