我有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)
我知道我的查询语句一定有问题,我只是不知道如何修复它。 有人请帮忙。感谢。
答案 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