您可能不想将其作为单个查询来执行,但理论上您可以这样做。
SELECT
Post.id AS post_id,
Post.title AS post_title,
Post.body AS post_body,
GROUP_CONCAT(CONCAT(Tag.id, "|", Tag.title) SEPARATOR '#') AS tags,
COUNT(Comment.id) AS comment_count
FROM Post
LEFT JOIN Comment ON Post.id = Comment.id_post
LEFT JOIN Post_Tag ON Post.id = Post_Tag.id_post
LEFT JOIN Tag ON Tag.id = Post_Tag.id_tag
GROUP BY Post.id
ORDER BY Post.date ASC
我没有检查这一点,因为我无权访问您的数据,但它应该可以工作。您需要手动拆分标签,这些标签将以“ID|TITLE#ID|TITLE”的格式显示,但这是唯一需要的额外处理。
或者,您可以通过在两个单独的查询之间拆分此工作负载来避免标签的 GROUP_CONCAT:
SELECT
Post.id AS post_id,
Post.title AS post_title,
Post.body AS post_body,
COUNT(Comment.id) AS comment_count
FROM Post
LEFT JOIN Comment ON Post.id = Comment.id_post
GROUP BY Post.id
ORDER BY Post.date ASC
由此,您可以存储所有单独的 post_ids,并在第二个查询中使用它们,如下所示:
SELECT
Tag.id,
Tag.title
FROM Post_Tag
INNER JOIN Tag ON Post_Tag.id_tag = Tag.id
WHERE Post_Tag.id_post IN (**comma-separated list of Post IDs**)
这意味着您可以执行两个查询,否则您必须执行一个查询来获取所有帖子,然后为每个帖子执行另一个查询来检索标签 - 这是一个 N+1 查询,而我上面建议的是解决该问题的通用方法。