tyb*_*103 6 mysql sql tags tagging ruby-on-rails
假设我有以下表格:
id:整数
名称:字符串
id:整数
体:文本
id:integer
tag_id:integer
post_id:integer
我将如何编写一个查询,选择所有标记有以下所有标记的帖子(标签表的名称属性):"Cheese","Wine","Paris","Frace","City","风景","艺术"
另请参阅:需要有关sql查询的帮助以查找具有最多指定标记的内容(注意:类似,但不重复!)
OMG*_*ies 18
SELECT p.*
FROM POSTS p
WHERE p.id IN (SELECT tg.post_id
FROM TAGGINGS tg
JOIN TAGS t ON t.id = tg.tag_id
WHERE t.name IN ('Cheese','Wine','Paris','Frace','City','Scenic','Art')
GROUP BY tg.post_id
HAVING COUNT(DISTINCT t.name) = 7)
Run Code Online (Sandbox Code Playgroud)
SELECT p.*
FROM POSTS p
JOIN (SELECT tg.post_id
FROM TAGGINGS tg
JOIN TAGS t ON t.id = tg.tag_id
WHERE t.name IN ('Cheese','Wine','Paris','Frace','City','Scenic','Art')
GROUP BY tg.post_id
HAVING COUNT(DISTINCT t.name) = 7) x ON x.post_id = p.id
Run Code Online (Sandbox Code Playgroud)
SELECT p.*
FROM POSTS p
WHERE EXISTS (SELECT NULL
FROM TAGGINGS tg
JOIN TAGS t ON t.id = tg.tag_id
WHERE t.name IN ('Cheese','Wine','Paris','Frace','City','Scenic','Art')
AND tg.post_id = p.id
GROUP BY tg.post_id
HAVING COUNT(DISTINCT t.name) = 7)
Run Code Online (Sandbox Code Playgroud)
事情的关键是COUNT(DISTINCT t.name)
需要匹配标签名称的数量,以确保所有这些标签与帖子相关.如果没有DISTINCT,那么其中一个名称的重复可能会返回7的风险 - 所以你会有误报.
大多数人会告诉你JOIN是最优的,但是JOIN还冒着重复结果集中的行的风险.EXISTS将是我的下一个选择 - 没有重复的风险,通常执行速度更快,但检查解释计划最终将根据您的设置和数据告诉您什么是最好的.
归档时间: |
|
查看次数: |
2646 次 |
最近记录: |