如果count = 0,如何包含SQL count的结果?

时间:2018-11-04 15:46:08

标签: mysql sql count left-join

我有一张成绩(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-be​​ginner-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)

非常感谢您的帮助!

4 个答案:

答案 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)

一种选择是将INFORMATION_SCHEMA.CHARACTER_SETS的{​​{1}}递归地用作:

cross/left joins

Rextester Demo

答案 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;