【问题标题】:MYSQL Select using Left Join, Count, Group byMYSQL 选择使用左连接、计数、分组依据
【发布时间】:2020-05-05 19:36:12
【问题描述】:

我有这个问题:

SELECT c.`id`, w.`qty`, COUNT(c.`id`) AS pieces, c.`location`
FROM `control` AS c
LEFT JOIN `warehouse` AS w ON w.`id` = c.`id`
WHERE c.`code` = '40'
GROUP BY c.`id`

我有这些表:

`control` c                                 `warehouse` w
+----+--------+------+----------+          +------+-------+
| id | pieces | code | location |          |  id  |  qty  |
+----+--------+------+----------+          +------+-------+
| 112|  112-1 |  40  |  london  |          |  112 |   3   |
| 112|  112-2 |  40  |  london  |          |  113 |   3   |
| 112|  112-3 |  40  |  london  |          |  114 |   1   |
| 113|  113-1 |  40  |  italy   |          |  115 |   1   |
| 113|  113-2 |  40  |  italy   |          +--------------+
| 113|  113-3 |  40  |  italy   |
| 114|  114-1 |  41  |  france  |
| 115|  115-1 |  41  |  france  |
| 112|  112-1 |  40  |  germany |
| 112|  112-2 |  40  |  germany |
| 112|  112-3 |  40  |  germany |
| 113|  112-1 |  40  |  russia  |
| 113|  112-2 |  40  |  russia  |
| 113|  112-3 |  40  |  russia  |
| 112|  112-1 |  40  |  poland  |
| 112|  112-2 |  40  |  poland  |
| 112|  112-3 |  40  |  poland  |
+-------------------------------+

我得到了这个:

实际输出

+-----+-----+--------+----------+
|  id | qty | pieces | location |
+-----+-----+--------+----------+
| 112 |  3  |    9   |  poland  |
| 113 |  3  |    6   |  russia  |
+-------------------------------+

我正在尝试得到这个结果:

想要的输出

+-----+-----+--------+----------+
|  id | qty | pieces | location |
+-----+-----+--------+----------+
| 112 |  3  |    3   |  london  |
| 113 |  3  |    3   |  italy   |
| 112 |  3  |    3   |  germany |
| 113 |  3  |    3   |  russia  |
| 112 |  3  |    3   |  poland  |
+-------------------------------+

这个结果可能吗?也许调整我​​的查询? 我尝试不使用GROUP BY,但在这种情况下,我只会得到 1 行总计 pieces

【问题讨论】:

  • 请解释一下您的 Pieces 专栏的逻辑。当你的表中有这样的列时,为什么你要把 id 算作碎片。

标签: mysql sql group-by left-join


【解决方案1】:

如果要将不同的位置分隔到不同的行,则需要将该列添加到group by 子句中:

SELECT c.`id`, w.`qty`, COUNT(c.`id`) AS pieces, c.`location`
FROM `control` AS c
LEFT JOIN `warehouse` AS w ON w.`id` = c.`id`
WHERE c.`code` = '40'
GROUP BY c.`id`, c.`location`
-- Here ---------^

【讨论】:

    【解决方案2】:

    我怀疑你只需要将qtylocation 添加到group by 子句中:

    SELECT c.`id`, w.`qty`, COUNT(*) AS pieces, c.`location`
    FROM `control` AS c
    LEFT JOIN `warehouse` AS w ON w.`id` = c.`id`
    WHERE c.`code` = '40'
    GROUP BY c.`id`, w.`qty`, c.`location`
    

    从 MySQL 5.7 开始,必须在 group by 子句中列出所有非聚合列(除非您更改默认 sql 选项 ONLY_FULL_GROUP_BY);大多数其他数据库也实现了这个约束。我会建议习惯它...

    旁注:

    • COUNT(c.id) 最好写成COUNT(*),因为id 似乎是一个不可为空的列

    • 一般来说,除非绝对必要,否则应避免在表名和列名周围使用反引号。

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 2010-10-16
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2011-03-02
      • 2012-09-18
      相关资源
      最近更新 更多