SQL独特查询返回带有或不带有Where子句

时间:2018-09-27 09:41:04

标签: mysql sql

我正在使用2个sql查询来获得不同的结果,但是两个查询都返回相同的结果。 这里是查询:

mysql> select count(distinct(device_id)) from device_desktops where created_at >="2018-09-17";
+----------------------------+
| count(distinct(device_id)) |
+----------------------------+
|                       3023 |
+----------------------------+
1 row in set (0.24 sec)

mysql> select count(distinct(device_id)) from device_desktops where created_at >="2018-09-17" and status="Pass";
+----------------------------+
| count(distinct(device_id)) |
+----------------------------+
|                       3023 |
+----------------------------+
1 row in set (0.25 sec)

mysql> select count(distinct(device_id)) from device_desktops where created_at >="2018-09-17" and status="Fail";
+----------------------------+
| count(distinct(device_id)) |
+----------------------------+
|                       1025 |
+----------------------------+
1 row in set (0.05 sec)

这是表结构:

+------------------+------------------+------+-----+---------+----------------+
| Field            | Type             | Null | Key | Default | Extra          |
+------------------+------------------+------+-----+---------+----------------+
| id               | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| device_id        | varchar(191)     | NO   |     | NULL    |                |
| station          | varchar(191)     | NO   |     | NULL    |                |
| lower_limit      | varchar(191)     | NO   |     | NULL    |                |
| flag             | varchar(191)     | NO   |     | NULL    |                |
| test_description | text             | NO   |     | NULL    |                |
| actual_result    | varchar(191)     | NO   |     | NULL    |                |
| upper_limit      | varchar(191)     | NO   |     | NULL    |                |
| time             | varchar(191)     | NO   |     | NULL    |                |
| hw_id            | varchar(191)     | NO   |     | NULL    |                |
| test_type        | varchar(191)     | NO   |     | NULL    |                |
| test_id          | varchar(191)     | NO   |     | NULL    |                |
| status           | varchar(191)     | NO   |     | NULL    |                |
| misc             | varchar(191)     | NO   |     | NULL    |                |
| created_at       | timestamp        | YES  |     | NULL    |                |
| updated_at       | timestamp        | YES  |     | NULL    |                |
+------------------+------------------+------+-----+---------+----------------+
16 rows in set (0.00 sec)

为什么它在顶部的第一和第二个查询中返回相同的结果, 而第三个查询返回的结果则不同。 我的查询中有什么错误。 任何帮助将不胜感激..

我也尝试过以下查询:

mysql> select count(distinct device_id ) from device_desktops where created_at >="2018-09-17" group by status;
+----------------------------+
| count(distinct device_id ) |
+----------------------------+
|                       1025 |
|                        119 |
|                       3023 |
+----------------------------+
3 rows in set (0.46 sec)

我也尝试了以下查询,但没有不同之处:

mysql> select count(device_id) from device_desktops where created_at >="2018-09-17";
+------------------+
| count(device_id) |
+------------------+
|            64744 |
+------------------+
1 row in set (0.06 sec)

mysql> select count(device_id) from device_desktops where created_at >="2018-09-17" and status="Fail";
+------------------+
| count(device_id) |
+------------------+
|             3628 |
+------------------+
1 row in set (0.07 sec)

mysql> select count(device_id) from device_desktops where created_at >="2018-09-17" and status="Pass";
+------------------+
| count(device_id) |
+------------------+
|            60964 |
+------------------+
1 row in set (0.08 sec)

2 个答案:

答案 0 :(得分:2)

如果所有设备都具有status='pass',并且其中1025个设备具有status='fail',那么结果就可以了,因为您使用了distinct。尝试不使用distinct,您将看到所有设备的数量将为通过设备和发生故障的设备以及可能具有其他状态(可能为null或空)的设备的总和。

示例:

  • 您有设备1、2。

  • 这两个设备都具有状态为“通过”的行

  • 设备1的状态为“失败”的行

结果:

  • 第一个查询将返回两个设备。

  • 第二个查询返回两个设备。

  • 第三个查询仅返回设备一。

如果删除不重复的内容,则每个查询分别有3、2、1行

答案 1 :(得分:0)

这是您的数据:

  1. 表中有3023个不同的设备ID。
  2. 对于3023个设备ID,存在一个或多个状态为“通过”的记录
  3. 对于1025个设备ID,存在一个或多个状态为“失败”的记录
  4. 对于119个设备ID,存在一个或多个记录具有另一种状态(可能为NULL)。

我认为这很明显:-)