mysql - 从查询中的 4 个连接表中获取数据 (MySQL)

标签 mysql join

database tables .

我有 4 个表,如上所示。现在,我试图在 ONE 查询中获取所有数据,包括文章主题、每篇文章的标签以及每篇文章的评论数。

我现在使用的sql查询是

SELECT
    articles.subject, GROUP_CONCAT(tags.name) AS tags, COUNT(comments.aid) AS comments
FROM articles
    LEFT JOIN comments ON comments.aid = articles.aid
    LEFT JOIN relations ON relations.aid = articles.aid
    LEFT JOIN tags ON tags.tid = relations.tid
GROUP BY
    articles.aid

结果:[]中的数据是我实际得到的

array
(
    1 => array
    (
        subject => foo
        tags =>
        comments => 1
    )
    2 => array
    (
        subject => bar
        tags => html,mysql [html,mysql,html,mysql]
        comments => 2 [4]
    )
    3 => array
    (
        subject => baz
        tags => php
        comments => 0
    )
)

对于我的应用程序中的真实情况,标签数量和评论数量会成倍增加。例如:如果一篇文章中有 4 条评论和 3 个标签,我的查询结果将是

标签:html、css、php、html、css、php、html、css、php、html、css、php(而不是 html、css、php)

评论:12(而不是 4)

我知道我的查询语句一定有问题,只是不知道如何修复它。 有人请帮忙。谢谢。

最佳答案

我认为你需要一个嵌套查询来计算评论数

SELECT
    articles.subject, GROUP_CONCAT(tags.tag) AS tags, comments
FROM articles
    LEFT JOIN (
          select aid,count(cid) as comments from comments group by aid
    ) AS commentscount ON commentscount.aid = articles.aid
    LEFT JOIN relations ON relations.aid = articles.aid
    LEFT JOIN tags ON tags.tid = relations.tid
GROUP BY
    articles.aid

关于mysql - 从查询中的 4 个连接表中获取数据 (MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12481381/

相关文章:

postgresql - 多个 UPDATE ... FROM 同一行不起作用

sql - 如果 condition1 为真,则将一个表与一个表连接,如果条件 1 为假,则与另一个表连接?

python - 通过关键列合并一列的中位数 - SFrame/Pandas

mysql - 使用连接条件创建 View

php - 如何在 PHP 中将动态生成的视频缩略图作为 BLOB 上传到 MySQL 数据库中

c# - Dapper.net 2.0 无法抛出异常

MySQL:当列的值超过阈值时,取消行的选择资格

php - MySQL 服务器已消失 - 共享帐户

php - 错误 SET SQL_BIG_SELECTS=1 或 SET MAX_JOIN_SIZE=#

mysql - 有什么比在 MySQL 中连接表更有效的方法吗?