sql distinct查询返回相同的结果,带或不带out where子句

pprl5pva  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(357)

我使用两个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)
kmbjn2e3

kmbjn2e31#

这是您的数据:
表中有3023个不同的设备ID。
对于3023设备ID,存在一个或多个状态为“通过”的记录
对于1025设备ID,存在一个或多个状态为“fail”的记录
对于119设备标识,存在一个或多个具有其他状态(可能为空)的记录。
我认为这很明显:-)

bsxbgnwa

bsxbgnwa2#

如果你有 status='pass' 对于所有的设备,你有 status='fail' 对于其中的1025个,结果是可以的,因为您使用了 distinct . 尝试不使用 distinct 您将看到,所有设备的数量将是通过的设备和失败的设备以及可能具有其他状态(可能为null或空)的设备的总和。
例子:
你有设备1,2。
这两个设备都有一个状态为“pass”的行
设备1有一个状态为“fail”的行
结果:
第一个查询将返回两个设备。
第二个查询返回两个设备。
第3个查询只返回设备1。
如果删除distinct,则每个查询将分别有3、2、1行

相关问题