【问题标题】:SQL: Query two seperate tables and return counted values, then group by both returnsSQL:查询两个单独的表并返回计数值,然后按两个返回分组
【发布时间】:2018-09-24 08:40:08
【问题描述】:

我正在努力让这个查询正确。我有返回的表来显示昵称和两个关联的值。这些表格是: 用户(昵称、姓名等) postAuth(昵称,postID 等) postComm(昵称,comID 等)

如果 numPosts 和 numComments 中返回的两个值都为 NULL(也就是说,如果他们没有评论或创建帖子),我试图让它 NOT 包含用户。我不确定如何让它发挥作用。代码如下

SELECT u.nickname, pa.numPosts, pc.numComments
FROM Users u
LEFT JOIN
(SELECT pa.nickname, COUNT(pa.nickname) AS numPosts
    FROM postAuthors pa
    GROUP BY pa.nickname
)pa
ON u.nickname = pa.nickname LEFT JOIN 
(SELECT pc.nickname, COUNT(pc.nickname) AS numComments
    FROM postComments pc
    GROUP BY pc.nickname
)pc
ON u.nickname = pc.nickname;

这创造了

Nickname | numPosts | numComments

bob              1             2
sally            2             1
tommy         NULL          NULL
 etc.......

我不想显示tommy

【问题讨论】:

  • 如果我没记错的话,您似乎需要 INNER JOIN 而不是 LEFT 。
  • 请帮助澄清 1. 这是帖子还是 cmets 类型要求 2. 两者都需要。在后一种情况下,通过在末尾添加 not null 子句来过滤查询

标签: mysql sql join group-by


【解决方案1】:

只需在查询中添加WHERE pc.nickname IS NOT NULL OR pa.nickname IS NOT NULL,即

SELECT u.nickname, pa.numPosts, pc.numComments
FROM Users u
LEFT JOIN
(SELECT pa.nickname, COUNT(pa.nickname) AS numPosts
    FROM postAuthors pa
    GROUP BY pa.nickname
)pa
ON u.nickname = pa.nickname LEFT JOIN 
(SELECT pc.nickname, COUNT(pc.nickname) AS numComments
    FROM postComments pc
    GROUP BY pc.nickname
)pc
ON u.nickname = pc.nickname
WHERE pc.nickname IS NOT NULL OR pa.nickname IS NOT NULL

这将排除在 postAuthors 和 postComments 中都没有值的任何用户。

【讨论】:

  • 感谢我尝试过 WHERE 并遇到语法错误。一定是我写错了。
【解决方案2】:

使用 where 子句并设置非空条件

    SELECT u.nickname, tpa.numPosts, tpc.numComments
    FROM Users u
    LEFT JOIN
    (SELECT pa.nickname, COUNT(pa.nickname) AS numPosts
        FROM postAuthors pa
        GROUP BY pa.nickname
    )tpa
    ON u.nickname = tpa.nickname LEFT JOIN 
    (SELECT pc.nickname, COUNT(pc.nickname) AS numComments
        FROM postComments pc
        GROUP BY pc.nickname
    )tpc
    ON u.nickname = tpc.nickname;
   where tpa.nickname is not null or tpc.nickname is not null

【讨论】:

  • AND 取出所有空值,需要为 OR。除此之外,这有效。我已经尝试过几次并且出现语法错误
  • @Malkeir 我认为你没有使用别名,这就是你得到语法错误的原因
  • 老实说,我不确定我的不同之处。我可能写了 NOT NULL 而不是 IS NOT NULL。但不确定。
【解决方案3】:

您可以在此条件下在页面中显示时对其进行控制。

if(object->property_name==Null && object->property_name==Null ){
 continue;
}

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多