gpt4 book ai didi

php - MySQL LEFT JOIN 问题与三个 WHERE 语句

转载 作者:行者123 更新时间:2023-12-01 00:33:15 25 4
gpt4 key购买 nike

我正在为自己构建一个带有标签过滤功能的笔记应用程序,但在尝试使用标签抓取笔记时遇到了问题。标签过滤器需要使用 AND 而不是 IN,因为它有助于更​​好地缩小我要查找的范围。

我的表是这样配置的:

+ notes          note_id  |  note_title  |  note_uid

+ tags tag_id | tag_title

+ notes_tags nt_id | nt_note_id | nt_tag_id

notes_tags 表跟踪所有笔记的标签。

我不担心返回任何关于标签的信息,所以这里是一个 LEFT JOIN 示例,我目前使用它来仅获取带有仅 1 标签的笔记。 p>

SELECT * FROM notes_tags LEFT JOIN notes ON note_id = nt_note_id WHERE note_uid IN ( 1 ) AND nt_tag_id = 10

此查询运行完美,它获取了所有带有该单个标签 的笔记。但是,我在使用如下查询“查明”我的笔记时遇到问题:

SELECT * FROM notes_tags LEFT JOIN notes ON note_id = nt_note_id WHERE note_uid IN ( 1 ) AND nt_tag_id = 10 AND nt_tag_id = 11

我在语法上做错了什么?

最佳答案

假设您想要识别具有 nt_tag_ids 10 和 nt_tag_ids 11 的相关 notes_tags 记录的笔记,那么外连接只会让 DBMS 比它需要的更努力地工作。

这似乎是最明显的解决方案:

SELECT * FROM notes n
WHERE EXISTS (SELECT 1 FROM notes_tags nt
WHERE n.note_id=nt.nt_note_id
AND nt.nt_tag_id=10)
AND EXISTS (SELECT 1 FROM notes_tags nt2
WHERE n.note_id=nt2.nt_note_id
AND nt2.nt_tag_id=11);

另一种方法是:

SELECT n.*, COUNT(*) 
FROM notes n,
notes_tags nt
WHERE n.note_id-nt.nt_note_id
AND nt.nt_tag_id IN (10,11)
GROUP BY .... /* need to add these */
HAVING COUNT(*)=2;

请注意,这假定它们是对 notes_tags 表中的 nt_note_id 和 nt_tag_id 的唯一约束。

但是以上都只会返回notes表中的数据。如果需要从MN分解表中提取对应的行:

SELECT *
FROM notes n,
notes_tags nt,
notes_tags nt2
WHERE n.note_id=nt.nt_note_id
AND n.note_id=nt2.note_id
AND nt.nt_note_id=nt2.nt_note_id /* can help the optimizer come up with a faster query */
AND nt.nt_tag_id=10
AND nt2.nt_tag_id=11

您可能希望向输出列添加别名,以便更轻松地解析响应。

关于php - MySQL LEFT JOIN 问题与三个 WHERE 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2588340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com