1

数据库表 .

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

我现在使用的 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)

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

4

2 回答 2

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)-- 这将在计算时剔除重复项。

于 2012-09-18T17:01:56.977 回答
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
于 2012-09-18T17:03:51.927 回答