【问题标题】:My current MySQL join is not working我当前的 MySQL 连接不起作用
【发布时间】:2017-12-05 09:45:30
【问题描述】:

我有以下表格:

用户

id | name
-----------------
 1 | Johny Bravo

订单

id | users_id | number
----------------------
 1 |    1    | 111111
 2 |    1    | 222222
 3 |    1    | 333333
 4 |    1    | 444444

例子

id | text | number
------------------
 1 | test | 111111
 2 | test | 111111
 3 | test | 222222
 4 | test | 222222
 5 | test | 333333
 6 | test | 333333

期望的结果

id: 1
name: Johny Brawo
count(orders): 4
count(example): 6

我当前的查询不起作用

SELECT users.id, users.name, count(orders.id), count(example.id)
FROM users
LEFT JOIN orders ON orders.users_id=users.id
LEFT JOIN example ON example.number=orders.number
GROUP BY users.id

我目前的结果

id: 1
name: Johny Brawo
count(orders): 8
count(example): 8

任何帮助将不胜感激。

【问题讨论】:

  • 您收到什么错误,而不仅仅是“不工作”?
  • 更新问题
  • 我写一个大写的问题标题可以被认为是不礼貌的。
  • @ArkadiuszG。你知道,你真的应该接受一个答案,如果它对你有用。不这样做是很不礼貌的。

标签: php mysql join


【解决方案1】:

试试count(distinct orders.id), count(distinct example.id)

我真的没有做过任何 MySQL,但这适用于其他数据库...

【讨论】:

  • 谢谢,好的!但是我可以在计数后订购(不同的订单.id)? :)
  • 您绝对可以按任何列排序。 MySQL 在分组方面不是很严格,因此您可以对users 表中的任何字段以及COUNT 列中的任何字段进行排序。请参阅我的答案以获得解释,您的查询到底是做什么的。
【解决方案2】:

开始 - 一点理论。你的查询是做什么的?

首先是SELECTs 来自users 表的内容。

然后是LEFT JOINs 和orders 表。返回的行数是users 表中的行和orders 表中的匹配行的乘积。因此,仅通过此连接,您将有 6 行,每行以 Johny Bravo 作为用户,但具有不同的 orders 数据。

然后 - 另一个LEFT JOIN。这次是example 表。同样 - 返回的行数是来自orders 表的行与来自example 表的匹配行的乘积。因此,如果没有GROUP BYCOUNT,您将有八行结果。

现在,GROUP BY 查询部分。它有什么作用?它只是对具有匹配GROUP BY 列的行进行分组。因此,它将使用相同的users.id 对所有行进行分组。其中有八个。

标准COUNT() 将返回非空值的行数。由于有 8 行,因此两个计数都将返回 8。

现在,正如@GPW 建议的那样,解决方案是COUNT(DISTINCT x)。此函数返回 unique 非空行数。

因此,查询应如下所示:

SELECT users.id, users.name, count(DISTINCT orders.id), count(DISTINCT example.id)
FROM users
LEFT JOIN orders ON orders.users_id=users.id
LEFT JOIN example ON example.number=orders.number
GROUP BY users.id

更新 - 排序和严格的数据库

您还询问了有关订购结果的问题。您可以按查询中的任何列对其进行排序。由于 MySQL 在分组方面不是很严格,您还可以按 users 表中的任何列排序,因为 users 表结果是唯一的(按 id 分组)。您也可以添加,例如ORDER BY COUNT(DISTINCT orders.id) DESC,以查找订单数量最多的用户。

不过,大多数数据库在 GROUP BY 查询中更加严格。它只允许SELECT 具有聚合值的列或明确包含在GROUP BY 子句中的列。所以你的GROUP BY 子句应该看起来像

GROUP BY users.id, users.name

【讨论】:

    猜你喜欢
    • 2017-08-12
    • 1970-01-01
    • 2017-01-24
    • 2021-09-18
    • 2017-06-12
    • 2012-01-11
    • 1970-01-01
    • 2017-10-11
    • 2015-03-16
    相关资源
    最近更新 更多