我想问一个有关 mysql 查询的简单问题。
我有一个名为 trans 的表:
+----+---------------------+------+-------+----------+----------+
| ID | Date | User | PCNum | Customer | trans_In |
+----+---------------------+------+-------+----------+----------+
| 8 | 2013-01-23 16:24:10 | test | PC2 | George | 10 |
| 9 | 2013-01-23 16:27:22 | test | PC2 | Nick | 0 |
| 10 | 2013-01-24 16:28:48 | test | PC2 | Ted | 10 |
| 11 | 2013-01-25 16:36:40 | test | PC2 | Danny | 10 |
+----+---------------------+------+-------+----------+----------+
以及另一位指定客户:
+----+---------+-----------+
| ID | Name | Surname |
+----+---------+-----------+
| 1 | George | |
| 2 | Nick | |
| 3 | Ted | |
| 4 | Danny | |
| 5 | Alex | |
| 6 | Mike | |
.
.
.
.
+----+---------+-----------+
我想查看某个日期范围内特定客户的 trans_in 列的总和,但也将在所选日期范围内没有任何记录的客户包含在结果集中。它们的 trans_in 总和可能显示为 NULL 或 0,但这并不重要...
我有以下查询:
SELECT
`Date`,
Customer,
SUM(trans_in) AS 'input'
FROM trans
WHERE Customer IN('George','Nick','Ted','Danny')
AND `Date` >= '2013-01-24'
GROUP BY Customer
ORDER BY input DESC;
但这只会返回“Ted”和“Danny”的总和,因为他们只在 1 月 24 日之后有交易...
如何包含 WHERE IN (...) 函数内的所有客户,甚至是那些在选定日期范围内没有交易的客户?
我想我必须以某种方式将他们加入到客户表中,但我不知道如何做。
提前致谢!!
:)
最佳答案
为了包含一个表中的所有记录而不匹配另一个表中的记录,您必须使用 LEFT JOIN。
SELECT
t.`Date`,
c.name,
SUM(t.trans_in) AS 'input'
FROM customers c LEFT JOIN trans t ON (c.name = t.Customer AND t.`Date` >= '2013-01-24')
WHERE c.name IN('George','Nick','Ted','Danny')
GROUP BY c.name
ORDER BY input DESC;
当然,我要提一下,您应该通过 ID 来引用客户,而不是通过相关表中的名称来引用客户。您当前的设置会导致信息重复。如果客户更改了姓名,您现在必须更新 trans 表中的所有相关记录,而不仅仅是客户表中的记录。
关于Mysql 包含没有针对特定日期返回行的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14604188/