Mysql 从表1中选择,其中表2包含所有搜索参数

Mysql 从表1中选择,其中表2包含所有搜索参数,mysql,where-clause,Mysql,Where Clause,我有两张桌子(笔记和标签)。标记具有注释的外键。单个注释记录中可能有多个标记记录 我试图只选择包含所有所需标记的注释 SELECT notes.*, tags.* FROM notes LEFT JOIN tags ON notes.id = tags.note_id WHERE {my note contains all three tags I would like to search on} 在(‘水果’、‘肉’、‘蔬菜’)中使用WHERE tag.name将带回所有带有“水果”、“肉

我有两张桌子(笔记和标签)。标记具有注释的外键。单个注释记录中可能有多个标记记录

我试图只选择包含所有所需标记的注释

SELECT notes.*, tags.* FROM notes LEFT JOIN tags ON notes.id = tags.note_id 
WHERE {my note contains all three tags I would like to search on}
在(‘水果’、‘肉’、‘蔬菜’)中使用WHERE tag.name将带回所有带有“水果”、“肉”或“蔬菜”标签的音符。我只想退回所有三个“水果”、“肉”和“蔬菜”标签的钞票

我可以带回多条记录(上面的查询将为每个标记生成一条记录)


我的where子句需要帮助。是否可以在没有子选择的情况下执行此操作?

如果还不算太晚,是否最好有一个NoteTag表-这样您就有了便笺、标签、NoteTag表,并且您可以使用简单的查询和and运算符来查找所需内容?

根据请求,没有子选择:

SELECT  notes.*
FROM    notes
JOIN    tags
ON      tag.note = notes.id
        AND tag.name IN ('fruit','meat','vegetable')
GROUP BY
        notes.id
HAVING  COUNT(*) = 3
更有效的方法是:

SELECT  notes.*
FROM    (
        SELECT  to.note
        FROM    tags to
        WHERE   to.name = 'meat'
        AND     EXISTS
                (
                SELECT  NULL
                FROM    tags ti
                WHERE   ti.note = to.note
                        AND to.name IN ('fruit', 'vegetable')
                LIMIT 1, 1
                )
        ) t
JOIN    notes
ON      note.id = t.note
这里的诀窍是将搜索放在最具选择性的标记(在我的示例中为“meat”)的第一位。

假设标记(注意,标记)被声明为唯一或PK,那么您可以使用:

SELECT note_id, COUNT(tag) FROM tags
WHERE tag IN ('fruit', 'vegetable', 'meat')
GROUP BY note_id
HAVING COUNT(tag) >= 3
根据OP下面的评论进一步回答。要获取匹配记录的所有标记,请执行以下操作:

SELECT * FROM tags
INNER JOIN
(
SELECT note_id, COUNT(tag) FROM tags
WHERE tag IN ('fruit', 'vegetable', 'meat')
GROUP BY note_id
HAVING COUNT(tag) >= 3
) search_results
ON search_results.note_id = tags.note_id

这很接近。我还想带回与便笺相关的标签(所有标签,而不仅仅是搜索到的标签)。选择注释。*,标记。*。。。根据标签的数量,每个便笺应该有多条记录。但是我仍然需要能够返回与便笺相关的所有标签。此查询将返回每个注释1条记录,而每个注释的记录数应与标记数相同。只需将上面的解决方案连接回tags表,即可获得每个标记一条记录。我在原始答案中添加了SQL来实现此连接。为此,注释和标记(注释带有外键)就足够了,但为了便于讨论,使用单独的外部参照表仍然会出现相同的问题。选择与查询的所有标记匹配的所有注释(以及相应的标记)。