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

时间:2012-09-18 16:41:40

标签: 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)

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

2 个答案:

答案 0 :(得分:1)

当您在常用列上将表连接在一起时,您将获得共享这些列的行的所有组合。

在这种情况下,对于aid 2,文章有1行,评论有2行,关系有2行。 1 * 2 * 2 = 4,这是COUNT()函数的结果。

如果您要运行此查询:

SELECT * 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
WHERE articles.aid = 2

您将能够看到COUNT正在计算的四个生成的行。

aid | subject | cid | comment  | tid | name
----+---------+-----+----------+-----+------
2   | bar     | 1   | comment1 | 1   | html
2   | bar     | 1   | comment1 | 3   | mysql
2   | bar     | 2   | comment2 | 1   | html
2   | bar     | 2   | comment2 | 3   | mysql

如果您只想计算评论数量,可以将查询中的COUNT(comments.aid)更改为COUNT(DISTINCT comments.cid) - 这会在计数时删除重复项。

答案 1 :(得分:1)

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

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