包含多个标记的SQL查询

spa*_*kle 3 mysql sql tags

我非常善于解释这一点.但我尽我所能:

我为人们制作了一个标记工具.有些人包含超过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条件?有人知道吗?
对不起,我的英语不好 :)

Ham*_*ite 5

你需要使用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)