【问题标题】:MYSQL - Left Join on multiple conditions - Medias & Tags & Tag LinksMYSQL - 在多个条件下左连接 - 媒体和标签和标签链接
【发布时间】:2020-06-19 17:30:04
【问题描述】:

我找不到任何符合我的问题的内容。

我正在尝试改进我的文件搜索查询,以便能够通过多个标签(AND 和 OR)获取图像。

获取具有一个或另一个标签的图像相当容易:

SELECT M.*, MTL.tag_id 
FROM medias M 
LEFT JOIN medias_taglinks MTL ON MTL.media_id=M.id 
WHERE ( MTL.tag_id = '1' || MTL.tag_id = '2') 
GROUP BY M.id

但是,如果我想获取具有这两个标签的图像,我没有得到任何结果,而且我不明白为什么。

SELECT M.*, MTL.tag_id 
FROM medias M 
LEFT JOIN medias_taglinks MTL ON MTL.media_id=M.id 
WHERE ( MTL.tag_id = '1' && MTL.tag_id = '2') 
GROUP BY M.id

我猜我需要将我的条件添加到联接中,但我还没有成功。

这里的 SQL FIDDLE:http://sqlfiddle.com/#!9/6e5d6/4

【问题讨论】:

  • 一种被低估的 SQL 调试技术是正确的格式。
  • 同意,有些请求确实变得复杂了。 :)
  • 解释你期望得到什么以及为什么。否则,除了 SQL 语义的另一种表示不能解决您的误解之外,还有什么可以回答的呢?此外,这种澄清会导致有效的搜索短语。是的,这是一个常见问题解答。在考虑发布之前,请始终在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,带有和不带有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布,请使用一个措辞作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS把所有需要的东西都放在你的帖子里。
  • 您的问题是什么? “你们有谁可以帮忙吗?”不是一个有效的问题。您的总体目标是常见问题解答。您的第二个代码问题也是一个常见问题解答。当你得到一个你不期望/不理解的结果时,停止试图找到你的总体目标并找出你的误解是什么。--隔离第一个意外/误解的子表达式及其输入和输出,了解什么是误解、错字、错误的推理等导致了它。 (调试基础。)询问一下。
  • 感谢您的建议@philipxy。下次我会尽量考虑这些点。

标签: mysql join count left-join


【解决方案1】:

检查图像是否有两个不同的标签需要比较行间的值,这反过来又建议聚合:

select m.id, m.name
from medias m
inner join medias_taglinks t on t.media_id = m.id
where t.tag_id in (1, 2)
group by m.id, m.name
having min(t.tag_id) <> max(t.tag_id)

查询过滤两个搜索到的标签,按媒体聚合,并确保两个标签都存在。

在您的数据库小提琴中,这会产生:

id | name
-- | ----
1  | Media 1

如果你想处理两个以上的标签,这里有一个更通用的方法:

select m.id, m.name
from medias m
inner join medias_taglinks t on t.media_id = m.id
where t.tag_id in (1, 2, 3, 4)
group by m.id, m.name
having count(*) = 4

这假定标签表中没有重复的(media_id, tag_id);否则,您需要having count(distinct t.tag_id) = 4

旁注:left join 似乎没有必要;如果要在媒体中搜索标签,无论如何都需要带标签表。

【讨论】:

  • 太好了,这就是我想要的结果。谢谢。但是,我不明白“有线”的目的?你能解释一下吗?
  • @oriongu:它过滤组以确保它们具有所有必需的标签。
  • 好的,感谢@GMB 的解释 :) 非常感谢。
猜你喜欢
  • 2011-04-20
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
相关资源
最近更新 更多