首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从查询中的4个连接表(MySQL)中获取数据

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

Stack Overflow用户
提问于 2012-09-18 16:41:40
回答 2查看 173关注 0票数 1

如上文所示,我有4张桌子。现在,我试图在ONE查询中获取所有数据,包括文章主题、每篇文章的标记和每篇文章的注释数量。

我现在使用的sql查询是

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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)

评论: 12 (而不是4)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-18 17:03:51

我认为您需要一个嵌套查询来计算注释。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2012-09-18 17:01:56

在公共列上将表连接在一起时,将得到共享这些列的所有行组合。

在本例中,对于aid 2,文章中有1行,注释中有2行,关系中有2行。1*2*2 = 4,这是COUNT()函数的结果。

如果要运行此查询:

代码语言:javascript
复制
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正在计算的四个生成的行。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12481381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档