使用以下查询:
SELECT p.*, i.*, GROUP_CONCAT(DISTINCT(pc.category_id)) AS post_categories, GROUP_CONCAT(DISTINCT(pt.tag_id)) AS post_tags
FROM posts AS p
LEFT JOIN images AS i ON p.post_image = i.image_id
LEFT JOIN post_categories AS pc ON p.post_id = pc.post_id
LEFT JOIN post_tags AS pt ON p.post_id = pt.post_id
WHERE p.post_url="'.$id.'"
我正在返回一个博客文章列表,检索:
- 帖子表中的每一列
- 图片表中的每一列(用于发布图片)
- all 的串联
category_id
(用于帖子) - all 的串联
tag_id
(用于帖子)
这给我留下了两个没有真正帮助的领域:
- 连接的 category_id 字符串(即“1,3”)
- 和串联的 tag_id 字符串(即“2,5,8”)
我真的很想在这两个中做一个子查询LEFT JOINS
,这样我就可以返回一个列表:
category_name
的(即“冥想、运动”)tag_name
的(即“iOS、PHP、MySQL”)
对于每个帖子。
我现在被困在两个类别和标签的子查询上。
表结构:
帖子
post_id、post_title 等
类别
类别 ID,类别名称
标签
tag_id, tag_name
post_categories
post_id, category_id
post_tags
post_id, tag_id
问题:是否有可能有效地做这样的事情,如果可以,怎么做?
如果不是,我是否应该只存储SELECT * FROM categories
在一个$categories
数组中,然后每次将数组中的每个帖子category_id
与$categories
数组中每个帖子的爆炸category_id
字符串进行比较$posts
?