代码之家  ›  专栏  ›  技术社区  ›  Salman Zafar Mehran

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

  •  -2
  • Salman Zafar Mehran  · 技术社区  · 7 年前

    以下是查询:

    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 回复  |  直到 7 年前
        1
  •  2
  •   kkica    7 年前

    status='pass' 对于所有的设备,你有 status='fail' distinct 不同的

    • 你有设备1,2。

    • 这两个设备都有一个状态为“pass”的行

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

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

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

        2
  •  0
  •   Thorsten Kettner    7 年前

    这是您的数据:

    1. 对于1025设备ID,存在一个或多个状态为“Fail”的记录
    2. 对于119设备标识,存在一个或多个具有其他状态(可能为空)的记录。