gpt4 book ai didi

mysql - 这个复杂的查询该怎么做呢?

转载 作者:行者123 更新时间:2023-11-30 01:37:55 25 4
gpt4 key购买 nike

这是我的数据库架构:

Post:
id
title
body
date

Tag:
id
title

Post_Tag:
id
id_post
id_tag

Comment:
id
id_post
body
date

帖子和标签之间存在多对多关系。

我需要在主页上打印最新 10 篇帖子:

<a href="post.php?id=ID_POST">POST_TITLE</a>

POST_BODY

<a href="tag.php?id=ID_TAG_1"> TAG_TITLE_1 </a>
<a href="tag.php?id=ID_TAG_2"> TAG_TITLE_2 </a>
<a href="tag.php?id=ID_TAG_3"> TAG_TITLE_3 </a>

COMMENTS_NUMBER

执行此操作的最佳查询是什么?

我已经尝试过这个,但效果不佳,因为每个帖子都有多行:

SELECT p.title, p.id, p.date, t.title, t.id, COUNT(c.id)
FROM post p
LEFT JOIN post_tag pt
ON p.id=pt.id_post
LEFT JOIN tag t
ON t.id=pt.id_tag
LEFT JOIN comment c
ON p.id=c.id_post
GROUP BY p.title, p.id, p.date, t.title
ORDER BY p.date DESC

最佳答案

您可能不想将其作为单个查询来执行,但理论上您可以这样做。

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 查询,而我所做的上述建议是解决该问题的常见方法。

关于mysql - 这个复杂的查询该怎么做呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16604762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com