MYSQL使用左连接、计数、分组进行选择

MYSQL使用左连接、计数、分组进行选择,mysql,sql,group-by,left-join,Mysql,Sql,Group By,Left Join,我有一个疑问: 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 +----+---

我有一个疑问:

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  |
+-------------------------------+
这个结果可能吗?也许可以调整我的查询?
我尝试不使用
分组方式
,但在这种情况下,我只得到一行合计
个数
如果要将不同的位置分隔为不同的行,则需要将该列添加到
分组方式
子句中:

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`
选择c.`id`,w.`qty`,计数(c.`id`)为件,c.`location`
从'control'改为c
左连接'warehouse'作为w上的w。'id`=c。'id`
其中c.`code`=“40”
按c.`id`,c.`位置分组`
--这里---------^

我怀疑您只需要将
数量和
位置添加到
分组依据
子句中:

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选项
仅\u FULL\u group by
);大多数其他数据库也实现此约束。我建议你习惯它

旁注:

  • COUNT(c.id)
    写得更好
    COUNT(*)
    ,因为
    id
    似乎是不可为空的列

  • 通常,除非绝对必要,否则应避免在表名和列名周围使用反勾号


请解释您的文章栏的逻辑。当您的表中有这样的列时,为什么要将id计为碎片。