Почему я получаю группу ошибок по результату подзапроса? - PullRequest
0 голосов
/ 17 января 2020

Я хочу найти количество записей трассировки с одинаковым телефоном, project_id, create_time, trace_content

Но это sql:

select count(1) from trace WHERE  DATE(create_time)="2020-01-16" AND 
  id not in (
     select id from trace WHERE DATE(create_time)="2020-01-16"  
     GROUP BY telephone,project_id,create_time,trace_content
);

возвращает неверный результат. Если я использую:

select count(1) from trace WHERE  DATE(create_time)="2020-01-16" AND 
    id not in (
               select id FROM (
                      select id from trace WHERE DATE(create_time)="2020-01-16"  
                      GROUP BY telephone,project_id,create_time,trace_content
              ) a
);

возвращает правильный результат. Mysql версия 5.6.26 Может кто-нибудь сказать мне причину 100

Например, таблица содержит эти данные:

  1. id = 1, project_id = 1, телефон = 1, trace_contest = test, creatime = 2020-01-16 18: 27: 46

  2. id = 2, project_id = 1, телефон = 1, trace_contest = test, creatime = 2020 -01-16 18: 27: 46

  3. id = 3, project_id = 2, телефон = 2, trace_contest = test1, creatime = 2020-01-16 18: 22: 27

fisrt sql return 0, секунда sql return 1

1 Ответ

1 голос
/ 17 января 2020

Оба ваших запроса на самом деле неверны: вы выбираете id, но это не является частью предложения group by, поэтому вы в основном получаете случайное значение из группы. В большинстве RDBMS (и в не древних версиях MySQL) это приведет к синтаксической ошибке.

Я понимаю, что вы хотите посчитать, сколько (telephone, project_id, create_time, trace_content) встречается в таблице более одного раза.

Для этого можно использовать два уровня агрегирования:

select count(*) cnt_duplicates
from (
    select 1
    from mytable
    where create_time >= '2020-01-16' and create_time < '2020-01-17'
    group by telephone, project_id, create_time, trace_content
    having count(*) > 1
) t

Внутренний запрос группирует записи и фильтры по тем, которые встречаются более чем на одном. Внешний запрос подсчитывает, сколько записей было возвращено внутренним запросом.

Обратите внимание, что я переписал ваше условие на дату, чтобы он мог воспользоваться индексом на create_time, если таковой имеется.

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