使用WHERE语句过滤其他表后,列出特定表的所有结果

时间:2013-05-30 00:37:19

标签: mysql join

我正在尝试为网页创建一个简单的类似博客的新闻片。为此,我有三个表:一个包含帖子,另一个包含类别,另一个链接帖子和类别(称为“关系”)。

我已经能够管理大部分查询,但仍有一个问题:类别blogroll。主要的问题是我想列出每个特定帖子的所有关系,但因为我是按特定关系过滤的,当然它只显示了这个关系。

实施例: 表1(POSTS):

POST_ID POST_TITLE POST_CONTENT
1       TEST       TEST
2       TES2       TEST2

表2(类别):

CAT_ID CAT_NAME
1      NEWS
2      PRODUCTS

表3(关系):

REL_POST REL_CAT
1        1
1        2
2        2

因此,Post 1同时属于'news'和'products',如果我要求提供'产品'类别的博客,那么这应该是输出:

POST_ID POST_TITLE POST_CONTENT POST_CATEGORIES
1       TEST       TEST         1:NEWS,2:PRODUCTS
2       TES2       TEST2        2:PRODUCTS

而不是那样,POST_CATEGORIES只列出2:PRODUCTS,因为我过滤了REL_CAT的查询。

以下是我设法制作的示例代码:

SELECT `post_id`, `post_title`, `post_content`, GROUP_CONCAT(CONCAT(rel_cat,':', cat_name)) AS post_categories
FROM `posts`
LEFT JOIN `relations` ON (`rel_post` = `post_id`)
LEFT JOIN `categories` ON (`cat_id` = `rel_cat`)
WHERE rel_cat = 2

有人能指出我做错了什么吗?我试图查阅手册并搜索网页,但大多数结果都指向那些有相反问题的人(他们想要从连接表中过滤结果),并且mysql手册可以用混淆的PERL编写,因为我已经读过了。

提前致谢。

3 个答案:

答案 0 :(得分:2)

您需要在RELATION表格上进行额外加入,因为您要搜索包含特定post的{​​{1}},并且您希望显示该category的所有类别

post

输出

SELECT  a.post_id, 
        a.post_title, 
        a.post_content, 
        GROUP_CONCAT(CONCAT(b.rel_cat,':', c.cat_name)) AS post_categories
FROM    posts a
        INNER JOIN relations b
            ON b.rel_post = a.post_id
        INNER JOIN categories c
            ON c.cat_id = b.rel_cat
        INNER JOIN RELATIONS d  
            ON  a.POST_ID = d.REL_POST  AND 
                d.REL_CAT = 2               -- <<== SEARCH HERE
GROUP   BY a.post_id, a.post_title, a.post_content

答案 1 :(得分:0)

我认为你所寻找的是这样的:

SELECT `post_id`, `post_title`, `post_content`, GROUP_CONCAT(CONCAT(rel_cat,':', cat_name)) AS post_categories
FROM `posts`
    LEFT JOIN `relations` ON (`rel_post` = `post_id`)
    LEFT JOIN `categories` ON (`cat_id` = `rel_cat`)
GROUP BY `post_id`

您需要删除WHERE条件才能获得所有/所有类别并添加GROUP BY


如果您尝试仅过滤那些具有特定cat的帖子,但显示该帖子的所有猫,那么您需要再次加入该表:

SELECT post_id, post_title, post_content, GROUP_CONCAT(CONCAT(r.rel_cat,':', cat_name) ORDER BY r.rel_cat) AS post_categories
FROM posts
    LEFT JOIN relations r ON (r.rel_post = post_id)
    LEFT JOIN categories ON (cat_id = r.rel_cat)
    INNER JOIN relations r2 ON (r2.rel_post = post_id )
WHERE r2.rel_cat = 2
GROUP BY post_id

答案 2 :(得分:0)

SELECT `post_id`, `post_title`, `post_content`, GROUP_CONCAT(CONCAT(cat_id,':', cat_name)) AS post_categories
FROM `posts`
    JOIN `relations` r1 ON (r1.`rel_post` = `post_id`)
    JOIN `relations` r2 ON (r2.`rel_post` = `post_id`)
    JOIN `categories` ON (`cat_id` = r2.`rel_cat`)
WHERE r1.`rel_cat` = 2
GROUP BY `post_id`

SQLFIDDLE