Mysql 返回相同结果的Sql distinct查询,带或不带out Where子句

Mysql 返回相同结果的Sql distinct查询,带或不带out Where子句,mysql,sql,Mysql,Sql,我使用2个sql查询来获得不同的结果,但这两个查询返回相同的结果。 以下是查询: mysql> select count(distinct(device_id)) from device_desktops where created_at >="2018-09-17"; +----------------------------+ | count(distinct(device_id)) | +----------------------------+ |

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

如果所有设备都有
status='pass'
,其中1025个设备有
status='fail'
,则结果是正常的,因为您使用了
distinct
。尝试不使用
distinct
,您将看到所有设备的数量将是通过的设备和失败的设备以及可能具有其他状态(可能为null或空)的设备的总和

例如:

  • 你有设备1,2

  • 这两个设备都有一个状态为class='pass'的行

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

结果:

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

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

  • 第三个查询只返回设备一

如果删除distinct,则每个查询将分别有3、2、1行

这是您的数据:

  • 表中有3023个不同的设备ID
  • 对于3023设备ID,存在一个或多个状态为“通过”的记录
  • 对于1025个设备ID,存在一个或多个状态为“Fail”的记录
  • 对于119设备ID,存在一个或多个具有其他状态(可能为空)的记录

  • 我认为这很明显:-)

    也许满足日期标准的数据本身在这两种情况下都具有通过状态。因此,即使只输入日期部分,如果查看状态,这些行可能会说“通过”。@arahman不可能假设从日期到现在总共有3023台设备,那么如何计数失败??结果完全不同。如果我们将3023+1025合并,即=4048。。但是这个查询说只有3023台设备被淘汰,如果1025台gas因失效而失效,@arahman声明该日期所有“通过”的设备也可能有失效状态,你能用新的
    device\u id
    和status Pass插入一个新条目吗?@SalmanZafar你是说如果你执行这个查询
    select count(distinct(device\u id))从device_桌面
    您将返回查询返回的
    3023
    行?@SalmanZafar
    device_id=10,status=“Pass”;设备id=10,status=“Fail”
    a
    DISTINCT(设备id)=1
    Good explainion.hi,感谢您的回答,我刚刚回答了我的问题并添加了三个查询。我刚刚执行了设备id总数=64744,状态通过=60964,状态失败=3628。所以3628+60964=64592,而设备id总数为64744,使用查询选择*从设备桌面上选择,创建时间>=“2018-09-17”,状态不在(“通过”,“失败”)你应该有其他状态的记录(空、空或其他)是的,你是对的。。应如何获得总设备的不同计数?我需要获得2018-09-17日期起的所有设备的独特/唯一计数。您的第一次查询就完成了。