1

使用以下查询:

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.'"

我正在返回一个博客文章列表,检索:

  1. 帖子表中的每一列
  2. 图片表中的每一列(用于发布图片)
  3. all 的串联category_id(用于帖子)
  4. 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

4

2 回答 2

1

您应该能够加入标签类别表,然后只需将您的串联替换为名称字段。(还必须将Distinct添加到选择中,以免返回重复的主行。)

SELECT DISTINCT p.*,  i.*, 
    GROUP_CONCAT(DISTINCT(c.category_name)) AS post_categories,
    GROUP_CONCAT(DISTINCT(t.tag_name)) 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 
    LEFT JOIN categories AS c ON pc.category_id = c.category_id
    LEFT JOIN tags AS t ON pt.tag_id = t.tag_id
WHERE p.post_url="'.$_GET['id'].'"
于 2012-04-24T22:46:41.570 回答
1

那么为什么不直接在 GROUP_CONCAT 中获取相应的类别名称和标签描述而不是它们的 ID

于 2012-04-24T22:46:59.933 回答