我有这3张桌子:
POST [id_post, url]
CAT [id_cat, name]
POST_CAT [id_post, id_cat]
我有10-15个类别,每个类别100-200个网址,但问题是网址可以有多个类别,然后...我想要显示所有类别1个网址,但该网址可以不会在其他类别中展示
我该怎么办?
我有这个SQL,但显然不能做我想要的事情:
SELECT c.nombre, p.url
FROM post_cat pc, posts p, categorias c
WHERE pc.id_post = p.id_post
AND c.id = pc.id_cat
GROUP BY pc.id_cat
谢谢你,抱歉我的英文不好!!!
---------------------------------------------
Data (Example):
CAT 1 - URL1, URL2
CAT 2 - URL1, URL2
CAT 3 - URL2, URL3
CAT 4 - URL1, URL2
这个节目:
CAT1 - URL1
CAT2 - URL2
CAT3 - URL3
CAT4 - URL1(因为URL1和URL2显示在其他类别中......如果重复或不重复,则显示其中1个独立)
答案 0 :(得分:1)
如果我理解正确,您需要为每个类别添加唯一的网址,其中该网址没有其他类别。不幸的是,在SQL中没有可靠的解决方案。但你可以近距离接触。
首先要为每个网址选择一个任意类别:
select p.url, min(pc.id_cat) as id_cat
FROM post_cat pc join
posts p
on pc.id_post = p.id_post
GROUP BY p.url
HAVING count(*) = 1;
having
子句保证url
只有一个类别。
接下来,您要为每个类别选择其中一个:
select id_cat, min(url) as url
from (select p.url, min(pc.id_cat) as id_cat
FROM post_cat pc join
posts p
on pc.id_post = p.id_post
GROUP BY p.url
HAVING count(*) = 1
group by id_cat;
如果您想要其他类别信息(例如名称),请加入类别表。 )p
答案 1 :(得分:0)
尝试 GROUP_CONCAT():
SELECT GROUP_CONCAT(c.nombre), p.url
FROM post_cat pc, posts p, categorias c
WHERE pc.id_post = p.id_post
AND c.id = pc.id_cat
GROUP BY pc.id_cat
这将创建一个文本字段,其中包含由GROUP BY子句分组的所有c.nombre值。
请参阅此处以获取有关此内容的完整文档:
答案 2 :(得分:0)
通过使用连接,您可以根据需要关联任意数量的表。联接是关系日期基础的核心。
Select c.nombre, p.url from post_cat pc join posts p on c.id=pc.id_cat
join categorias c on pc.id_cat=c.id_cat
另请考虑使用Left Join
,Right Join
,Union
。