powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка дубликатов
14 сообщений из 14, страница 1 из 1
Выборка дубликатов
    #38857605
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из таблицы нужно выбрать все записи, у которых определенное поле совпадает не более, чем n раз, а потом на эту выборку наложить условие LIMIT 50. После всех извращений получил такой запрос (для n = 2)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT
  *
FROM
  ads ad
WHERE
  ad.`phone_id` IS NOT NULL AND
  ad.`phone_id` IN (
    SELECT
      sad.`phone_id`
    FROM
      ads sad
    WHERE
      sad.`phone_id` IS NOT NULL
    GROUP BY
      sad.`phone_id`
    HAVING
      COUNT(*) <= 2
  )
LIMIT 50

Его можно как-нибудь оптимизировать. Смущает меня HAVING по всей таблице. Хотя планы отличные

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38857638
помимо группировки дубли можно выбрать при помощи JOIN, EXISTS-подзапроса.
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38857642
Добрый Э - Эх,

при условии, что кроме PHONE_ID в таблице есть ещё поля, по которым можно отличать одну запись от другой.
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38857683
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Условие
Код: sql
1.
ad.`phone_id` IS NOT NULL 


во внешнем запросе - лишнее.
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38857863
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaУсловие
Код: sql
1.
ad.`phone_id` IS NOT NULL 



во внешнем запросе - лишнее.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
EXPLAIN
SELECT
  *
FROM
  ads ad
WHERE
  ad.`phone_id` IS NOT NULL AND
  ad.`phone_id` IN (
    SELECT
      sad.`phone_id`
    FROM
      ads sad
    WHERE
      sad.`phone_id` IS NOT NULL
    GROUP BY
      sad.`phone_id`
    HAVING
      COUNT(*) = 2
  )


id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY ad range fk_ads_phone fk_ads_phone 9 NULL 197 Using where 2 DEPENDENT SUBQUERY sad range fk_ads_phone fk_ads_phone 9 NULL 197 Using where; Using index
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
EXPLAIN
SELECT
  *
FROM
  ads ad
WHERE
--  ad.`phone_id` IS NOT NULL AND
  ad.`phone_id` IN (
    SELECT
      sad.`phone_id`
    FROM
      ads sad
    WHERE
      sad.`phone_id` IS NOT NULL
    GROUP BY
      sad.`phone_id`
    HAVING
      COUNT(*) = 2
  )


id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY ad ALL NULL NULL NULL NULL 48601 Using where 2 DEPENDENT SUBQUERY sad range fk_ads_phone fk_ads_phone 9 NULL 197 Using where; Using index
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38857865
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эхпомимо группировки дубли можно выбрать при помощи JOIN, EXISTS-подзапроса.Что-то не соображу как
Добрый Э - Эхпри условии, что кроме PHONE_ID в таблице есть ещё поля, по которым можно отличать одну запись от другой.Само собой есть первичный ключ - поле id
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38857964
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На реальной базе мой запрос уходит в аут :(

А заказчик кричит "хочу"
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38857979
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17105176
мне уже лень переписывать...
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38857998
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Спасибо большое. Все ожило. Самое обидное, что теперь я вспоминаю, что и сам на эти грабли наступал.

В итоге запрос стал таким
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT
  *
FROM
  ads ad
WHERE
  ad.`phone_id` IS NOT NULL AND
  EXISTS (
    SELECT
      sad.`phone_id`
    FROM
      ads sad
    WHERE
      sad.`phone_id` = ad.`phone_id`
    HAVING
      COUNT(*) = 2
  )
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38858090
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять... ну если
Код: sql
1.
ad.`phone_id` IS NULL


то
Код: sql
1.
sad.`phone_id` = ad.`phone_id`


даёт FALSE, и условие
Код: sql
1.
ad.`phone_id` IS NOT NULL


лишнее.
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38858328
_Vasilisk_,

IMHO, но если ориентироваться на [NOT] EXISTS подзпросы, то лучше не использовать в них агрегацию, а напрямую проверять - есть запись с таким же номером телефона, но с другим ID (WHERE sad.`phone_id` = ad.`phone_id` and sad.id != ad.id).

Что касается JOIN-а, то суть в том, чтобы твой IN-подзапрос просто переписать в форму JOIN, сделав его некоррелированным
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38858689
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaлишнее.Если поле NULL, то не нужно дергать подзапрос. Или я не прав?
Добрый Э - Эхно с другим IDМне нужно вытянуть записи у которых дубликатов определенное количество. Т.е. если дубликата 3, то в данный запрос записи не попадают
Добрый Э - Эхсуть в том, чтобы твой IN-подзапрос просто переписать в форму JOIN,Вот я и не пойму, как я в таком джойне агрегацию сделаю? Или джойнить не таблицу, а подзапрос?
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38858696
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Если поле NULL, то не нужно дергать подзапрос. Или я не прав?
Неправ. Это SQL-сервер, а не программа на процедурном языке программирования.
...
Рейтинг: 0 / 0
Выборка дубликатов
    #38859239
_Vasilisk_Или джойнить не таблицу, а подзапрос?вот именно. делаешь изначально подзапрос, в котором вычисляешь дубли с нужным числом повторений (обычный GROUP BY + HAVING). далее джойнишь исходную таблицу на результат этого подзапроса.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка дубликатов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]