我有一张成绩(1-6)的桌子,像这样:
mysql> SELECT two FROM data WHERE date >= '2018-10-23 00:00:00' AND date < '2018-10-23 23:59:59';
+------+
| two |
+------+
| 5 |
| 1 |
| 1 |
| 2 |
| 1 |
| 2 |
| 2 |
| 1 |
| 1 |
+------+
9 rows in set (0.00 sec)
我需要像这样的每个年级出现的次数:
mysql> SELECT two, COUNT(1) as count from data lookup where date >= '2018-10-23 00:00:00' AND date < '2018-10-23 23:59:59' GROUP BY two;
+------+-------+
| two | count |
+------+-------+
| 1 | 5 |
| 2 | 3 |
| 5 | 1 |
+------+-------+
3 rows in set (0.00 sec)
但是我想包括成绩,即使所选内容中不存在成绩,例如:
+------+-------+
| two | count |
+------+-------+
| 1 | 5 |
| 2 | 3 |
| 3 | 0 |
| 4 | 0 |
| 5 | 1 |
| 6 | 0 |
+------+-------+
6 rows in set (0.00 sec)
我已经看到了使用LEFT JOIN和查找表的解决方案,但是对于我的SQL-beginner-head来说,它们太复杂了。
我已经创建了一个查询表(noten =成绩):
mysql> SELECT * from lookup;
+-------+
| noten |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+-------+
6 rows in set (0.00 sec)
但是我做错了...
mysql> SELECT two, COUNT(1) as count FROM data LEFT JOIN lookup on two=lookup.noten WHERE date >= '2018-10-23 00:00:
+------+-------+
| two | count |
+------+-------+
| 1 | 5 |
| 2 | 3 |
| 5 | 1 |
+------+-------+
3 rows in set (0.00 sec)
非常感谢您的帮助!
答案 0 :(得分:0)
Union All
在查询本身中模拟它,而不用创建一个实际的查找表,并将其用作Derived Table。Left Join
表执行data
。On
子句中指定右侧表上的任何条件,而不是{{1} }。如果在Where
中指定了它们,这将限制您的结果,并有效地使其仅成为内部联接。尝试以下操作:
Where
答案 1 :(得分:0)
您将使用left join
。诀窍是正确设置count()
和日期条件。我将其写为:
SELECT l.noten, COUNT(d.noten) as count
FROM lookup l LEFT JOIN
data d
ON d.noten = l.noten AND
d.date >= '2018-10-23' AND d.date < '2018-10-24'
GROUP BY l.noten
ORDER BY l.noten;
尤其要注意,日期逻辑不需要时间成分即可完成所需的操作。
答案 2 :(得分:0)
答案 3 :(得分:0)
通过@ gordon-linoff发布经过适当修改的版本,从而达到了目的。谢谢大家!
SELECT lookup.noten, COUNT(data.two) as count
FROM lookup LEFT JOIN
data ON data.two = lookup.noten AND
data.date >= '2018-10-23' AND data.date < '2018-10-24'
GROUP BY lookup.noten
ORDER BY lookup.noten;