Sql отдельный запрос, возвращающий тот же результат с или без предложения Where - PullRequest
0 голосов
/ 27 сентября 2018

Я использую 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 голосов
/ 27 сентября 2018

Это ваши данные:

  1. В таблице 3023 различных идентификатора устройства.
  2. Для 3023 идентификаторов устройства существует одна или несколько записей со статусом «Pass»
  3. Для 1025 идентификаторов устройств существует одна или несколько записей со статусом «Ошибка»
  4. Для 119 идентификаторов устройств существует одна или несколько записей с другим состоянием (возможно, NULL).

Я думаю, это довольно очевидно: -)

0 голосов
/ 27 сентября 2018

Если у вас есть status='pass' для всех устройств, и у вас есть status='fail' для 1025 из них, результат в порядке, потому что вы использовали distinct.Попробуйте без использования distinct, и вы увидите, что количество всех устройств будет представлять собой сумму проходящих устройств и отказавших устройств, а также устройств, которые могут иметь другой статус (возможно, нулевой или пустой).

Пример:

  • У вас есть устройства 1, 2.

  • Оба этих устройства имеют строку со статусом = 'pass'

  • Устройство 1 имеет строку со статусом = 'fail'

Результат:

  • 1-й запрос вернет оба устройства.

  • 2-й запрос возвращает оба устройства.

  • 3-й запрос возвращает только одно устройство.

Если вы удалили отдельный, у вас будет соответственно 3,2,1 строки для каждого запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...