我正在尝试为网页创建一个简单的类似博客的新闻片。为此,我有三个表:一个包含帖子,另一个包含类别,另一个链接帖子和类别(称为“关系”)。
我已经能够管理大部分查询,但仍有一个问题:类别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编写,因为我已经读过了。
提前致谢。
答案 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`