【问题标题】:mySQL - How to use a COUNT() statement in a JOINmySQL - 如何在 JOIN 中使用 COUNT() 语句
【发布时间】:2017-07-08 01:41:59
【问题描述】:

在 mySQL DB 中有一个名为 clients 的表。每个客户行都有一个列client_num。要列出所有客户,我只需使用此语句。

SELECT * FROM clients

现在每个客户端可能有也可能没有一些subclients,它们列在名为subclients 的单独表中,并通过表中的外键client_num 引用。

要找出一个客户端可能有多少个子客户端,我可以像这样在单独的调用中查询子客户端表:假设我们有一个带有 client_num 254 的客户端。

SELECT count(1) FROM subclients WEHRE sublicents.client_num = 254

所以查询返回类似 0, 1, 2, 3 , n

JOIN 我假设我必须做这样的事情:

SELECT 
  c.*,
  sc.????? 
FROM clients AS c
LEFT JOIN subclients AS sc ON sc.client_num = 254 

但我不知道如何将 count() 语句合并到 JOIN 中以获取子客户端的数量。另外我不知道LEFT JOIN是否正确。

感谢任何帮助

编辑:

我必须补充一点,我希望从客户端返回 all 行。额外返回的列COUNT(sc.client_num) 携带子客户端的数量。在下面的答案 2 中,我只得到返回的那些具有子客户端的客户端。 do not 具有子客户端的客户端将返回 not。如何解决?

【问题讨论】:

  • Left Join 没问题,因为您不需要检索每个 subclient 行,而且并非每个客户端都有子客户端。

标签: mysql


【解决方案1】:

您可以使用以下查询来获取每个客户端的所有子客户端的计数:

SELECT 
    c.*,
    COUNT(sc.client_num) 
FROM clients AS c
LEFT JOIN subclients AS sc ON sc.client_num = c.client_num
WHERE c.client_num = 254 
GROUP BY sc.client_sum

使用子选择的解决方案:

SELECT *, (SELECT COUNT(*) FROM subclients WHERE client_num = clients.client_num) 
FROM clients 
WHERE client_num = 254

演示: http://sqlfiddle.com/#!9/4930a/8/1

【讨论】:

  • 这里我得到一个 SQLSTATE[42000]:语法错误或访问冲突:1064。您的 SQL 语法有错误; ... 在 '*) 附近使用正确的语法
  • 指定一列而不是*
  • 我使用 LEFT JION,它似乎可以工作。有什么问题吗?我之前的 JOIN 语句有一个错误。现在它返回预期的数字
  • 在我看来,LEFT JOIN 的条件是错误的,就像问题中写的那样。应该是LEFT JOIN subclients AS sc ON sc.client_num = c.client_num
  • 就我现在而言,这并不重要。两者都是真的。但是我还有另一个我以前没有看到的问题。现在查询只返回子客户端可用的行。所有没有子客户端的客户端都被排除在外。所以最后我只得到了列表中预期客户总数的三分之一。我想我没有在我的问题中提到这一点。如何解决这个问题?
【解决方案2】:

我从 Stack Overflow 上的类似查询中读到的解决方案是使用子选择。如果您加入的唯一目的是Count,我建议您不需要加入。所以:

SELECT clients.*, (SELECT COUNT(*) FROM subclients 
WHERE subclients.client_num = clients.id ) AS numb FROM clients WHERE .... 

然后对于一行客户,他们将有一个列numb,这将是该客户拥有的子客户的数量。

reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多