Py学习  »  DATABASE

MYSQL-在多个条件下左连接-Medias&Tags&Tag链接

oriongu • 5 年前 • 1613 次点击  

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

带有一个或另一个标记的粪便图像相当容易:

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小提琴: http://sqlfiddle.com/#!9/6e5d6/4

干杯, 猎户座

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/55818
 
1613 次点击  
文章 [ 1 ]  |  最新文章 5 年前
GMB
Reply   •   1 楼
GMB    5 年前

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

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 .

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