Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка дубликатов / 14 сообщений из 14, страница 1 из 1
19.01.2015, 14:54:33
    #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
19.01.2015, 15:26:09
    #38857638
Выборка дубликатов
помимо группировки дубли можно выбрать при помощи JOIN, EXISTS-подзапроса.
...
Рейтинг: 0 / 0
19.01.2015, 15:28:04
    #38857642
Выборка дубликатов
Добрый Э - Эх,

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


во внешнем запросе - лишнее.
...
Рейтинг: 0 / 0
19.01.2015, 19:39:39
    #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
19.01.2015, 19:41:09
    #38857865
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дубликатов
Добрый Э - Эхпомимо группировки дубли можно выбрать при помощи JOIN, EXISTS-подзапроса.Что-то не соображу как
Добрый Э - Эхпри условии, что кроме PHONE_ID в таблице есть ещё поля, по которым можно отличать одну запись от другой.Само собой есть первичный ключ - поле id
...
Рейтинг: 0 / 0
20.01.2015, 00:02:48
    #38857964
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дубликатов
На реальной базе мой запрос уходит в аут :(

А заказчик кричит "хочу"
...
Рейтинг: 0 / 0
20.01.2015, 00:44:43
    #38857979
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дубликатов
17105176
мне уже лень переписывать...
...
Рейтинг: 0 / 0
20.01.2015, 02:35:27
    #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
20.01.2015, 09:13:39
    #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
20.01.2015, 12:01:31
    #38858328
Выборка дубликатов
_Vasilisk_,

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

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


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