簡體   English   中英

MYSQL 選擇使用左連接、計數、分組依據

[英]MYSQL Select using Left Join, Count, 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`

我有這些表:

`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

如果要將不同的位置分隔到不同的行,則需要將該列添加到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 ---------^

我懷疑您只需要在group by子句中添加qtylocation

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似乎是一個不可為空的列

  • 一般來說,除非絕對必要,否則您應該避免在表名和列名周圍使用反引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM