我非常善于解释这一点.但我尽我所能:
我为人们制作了一个标记工具.有些人包含超过1个标签,我需要得到那些但不知道如何编写SQL查询以包含多个标签.
我知道你不能写这样的条件:
LOWER(peoples_tags.tag_id)='
outside'AND LOWER(peoples_tags.tag_id)='summer'
因为每个人的结果都在他自己的行上,"外面"和"夏天"不会在同一行.因此,使用此查询不会得到任何结果.
这是整个查询:
SELECT DISTINCT peoples.*,tags.tag FROM people
JOIN peoples_tags ON peoples_tags.people_id = peoples.id
JOIN tags ON tags.tag = peoples_tags.tag_id AND
LOWER(peoples_tags.tag_id)='outside'AND
LOWER (peoples_tags.tag_id)='夏天'
那么我如何编写多标签SQL条件?有人知道吗?
对不起,我的英语不好 :)
你需要使用OR
而不是AND
.现在,你的思维过程是这样的:"我需要让行,其中的关键词是'外部’,并行,其中的关键词是'夏天’,所以我需要使用AND
".但是RDBMS看到它的方式,如果关键字是"室内" 或关键字是"夏天" ,你想要返回给定的行......所以你实际需要的是OR
,而不是AND
.
编辑:
我明白你现在想做什么.很抱歉以前没有仔细阅读过.
试试这个(可能有一个更有效/可扩展的方式,但这应该工作)
SELECT
*
FROM
people
WHERE
EXISTS(
SELECT
*
FROM
peoples_tags
WHERE
peoples_tags.people_id = people.id AND
peoples_tags.tag_id = 'outside'
) AND
EXISTS(
SELECT
*
FROM
peoples_tags
WHERE
peoples_tags.people_id = people.id AND
peoples_tags.tag_id = 'summer'
)
Run Code Online (Sandbox Code Playgroud)
编辑2:
假设tag_id和people_id的组合是peoples_tags的唯一键,以下内容也将起作用:
SELECT
people.*,
COUNT(*) AS Co
FROM
people
JOIN peoples_tags ON people.id = peoples_tags.people_id
WHERE
peoples_tags.tag_id = 'outside' OR
peoples_tags.tag_id = 'summer'
GROUP BY
people.id
HAVING
Co = 2
Run Code Online (Sandbox Code Playgroud)