SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.06.2014 10:18:20

warma2d
Завсегдатай
Зарегистрирован: 12.08.2012
Сообщений: 33

Как выбрать все дублирующие записи (оптимально) ?

Добрый день!

Есть таблица пользователей. Имеется в таблице колонка IP адресов и колонка Флагов. Необходимо выбрать всех пользователей, с IP которых было более 1 регистрации, и при этом хотя бы у одного флаг должен быть не равен 0.

В принципе, работает такой вариант, однако он не учитывает значение флага.

SELECT * FROM students
WHERE IP IN
(
  SELECT IP
  FROM students
  GROUP BY IP
  HAVING COUNT(1)>1
)
 


Однако здесь я вижу вложенный запрос, что отрицательно будет сказываться на производительности.
Наверно здесь делается цикл ?

Существует ли SQL запрос более эффективный ? (более оптимальный, если так можно сказать smile )

Пытаюсь здесь добавить второе условие, чтобы хотя бы у одного флаг был не равен 0.

SELECT * FROM students, rows
WHERE IP IN
(
  SELECT IP
  FROM students
  GROUP BY IP
  HAVING COUNT(1)>1
  AND (0>1 OR rows.comment_id != 0)
) AND students.id=rows.student_id
 

Однако при этом уже не выводятся все записи, зарегистрированные с одного IP адреса, а выводится только единственные записи, у которых флаг не равен 0.


Подскажите пожалуйста, в чем может быть проблема ?

Заранее спасибо!

Отредактированно warma2d (26.06.2014 10:57:36)

Неактивен

 

#2 26.06.2014 14:37:53

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как выбрать все дублирующие записи (оптимально) ?

Смотрите в сторону изменения подзапроса на JOIN-запрос.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 26.06.2014 16:03:43

warma2d
Завсегдатай
Зарегистрирован: 12.08.2012
Сообщений: 33

Re: Как выбрать все дублирующие записи (оптимально) ?

deadka написал:

Смотрите в сторону изменения подзапроса на JOIN-запрос.

Спасибо за ответ, однако у меня пока не получилось решить проблему.

Попробовал так:

SELECT * FROM students
 LEFT JOIN rows  ON id=rows.student_id
WHERE IP in
(
  select IP
  from students
  group by IP
  having count(1)>1
  OR rows.comment_id != 0
)


В данном случае выводятся все записи пользователей, которые имеют на 1 IP более 1 аккаунта. (т.е. остаётся добавить "второе" условие, чтобы флаг != 0)

Однако, если поставить AND rows.comment_id != 0, тогда выводится единственная запись, но без повторений других записей с тем же IP адресом. (т.е.  в данном случае "второе " условие срабатывает, а "первое" - показать всех, кто использует тот же IP --- нет)


Подскажите пожалуйста, в чём может быть проблема ?

Отредактированно warma2d (26.06.2014 16:05:17)

Неактивен

 

#4 26.06.2014 16:33:38

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как выбрать все дублирующие записи (оптимально) ?

Приведите пожалуйста пример данных - что есть в таблицах и что хочется получить


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 26.06.2014 16:47:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как выбрать все дублирующие записи (оптимально) ?

SELECT * FROM students
WHERE IP IN
(
  SELECT IP
  FROM students
  GROUP BY IP
  HAVING COUNT(1)>1
)


эквивалентен

SELECT s.* FROM students s
join
(
  SELECT IP
  FROM students
  GROUP BY IP
  HAVING COUNT(1)>1
) t on s.ip=t.ip;


Что касается второго условия, то если я вас правильно понял:
  HAVING COUNT(1)>1
нужно заменить на
  HAVING COUNT(*)>1 and sum(`поле флага`)>0

Неактивен

 

#6 27.06.2014 17:10:06

warma2d
Завсегдатай
Зарегистрирован: 12.08.2012
Сообщений: 33

Re: Как выбрать все дублирующие записи (оптимально) ?

vasya, Большое спасибо, все выдает как надо smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson