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计为碎片。