社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

oriongu • 5 年前 • 1617 次点击  

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

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

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
 
1617 次点击  
文章 [ 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表。