在多个表中选择

时间:2014-01-17 00:31:25

标签: mysql select

我有这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个独立)

3 个答案:

答案 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 JoinRight JoinUnion