MYSQL Выберите, используя Left Join, Count, Group by - PullRequest
0 голосов
/ 19 января 2020

У меня есть этот запрос:

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.

Ответы [ 2 ]

0 голосов
/ 19 января 2020

Я подозреваю, что вам просто нужно добавить qty и location к предложению 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 кажется не обнуляемым столбец

  • как правило, вы должны избегать использования кавычек вокруг имен таблиц и столбцов, за исключением случаев, когда это абсолютно необходимо.

0 голосов
/ 19 января 2020

Если вы хотите разделить разные местоположения на разные строки, вам нужно добавить этот столбец в предложение 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 ---------^
...