Официальный сайт студ.городка НГТУ
Программирование и БД » [mysql] поиск одинаковых записей в таблице 

#1  21.06.07 23:10

[mysql] поиск одинаковых записей в таблице

Как с помощью одного запроса узнать есть ли в таблице записи с одинаковым значением одного или нескольких  полей и вывести эти записи.

Например:

Personal
-------------------------------------------------------
id | Имя | Фамилия | Пол | Дата рождения |
-------------------------------------------------------

Узнать есть ли люди (в этой таблице :-) ) с одинаковым именем и полом. Вывести эти записи в качестве результата.

Как это сделать несколькими запросами я знаю - нужно всё сделать именно одним!

Исправлено west (21.06.07 23:11)

Offline

#2  21.06.07 23:31

Re: [mysql] поиск одинаковых записей в таблице

SELECT p1.*
FROM Personal AS p1 JOIN Personal AS p2 ON(p2.name=p1.name AND p2.gender=p1.gender)
WHERE p2.id != p1.id

Как-то так.

Offline

#3  22.06.07 00:01

Re: [mysql] поиск одинаковых записей в таблице

Код: sql:

SELECT name, gender, count(1) AS cnt FROM personal GROUP BY name, gender HAVING cnt > 1

Offline

#4  22.06.07 00:44

Maq
Профиль

Re: [mysql] поиск одинаковых записей в таблице

Bred Vilchec написал(а):

SELECT p1.*
FROM Personal AS p1 JOIN Personal AS p2 ON(p2.name=p1.name AND p2.gender=p1.gender)
WHERE p2.id != p1.id

жесть

Offline

#5  22.06.07 11:39

Re: [mysql] поиск одинаковых записей в таблице

Возможно. Там на самом деле надо бы DISTINCT добавить, но это уже костыль.

Offline

#6  23.06.07 22:16

Re: [mysql] поиск одинаковых записей в таблице

Maq, почему это то жесть это классический запрос. причем  бывает нужен  в жизни . и на многих собеседавниях на такой запрос акцент делают

Offline

#7  23.06.07 23:00

Maq
Профиль

Re: [mysql] поиск одинаковых записей в таблице

Stell Hawk, жесть потому то жесть)))
сравни решение с постом XuMiX

Offline

#8  24.06.07 01:39

Re: [mysql] поиск одинаковых записей в таблице

Bred Vilchec написал(а):

Re: [mysql] поиск одинаковых записей в таблице

Возможно. Там на самом деле надо бы DISTINCT добавить, но это уже костыль.

Почемуж костыль, нормальный запрос с дистинктом.

Offline

#9  24.06.07 09:45

Re: [mysql] поиск одинаковых записей в таблице

Maq, да потому что у XuMiXа,  при всем уважении, не правильный запрос, этот запрос сгруппирует фамилии а задании этого делать нельзя
это правильный ответ:
-------------------------------------------------------
id | Имя | Фамилия | Пол | Дата рождения |
1 |  ааа | иииииии | ж    | 10.06.2004         |
2 |  ааа | ббббббб | ж    | 14.01.1984         |
3 |  ббб |  зззззззз  |  м    | 15.01.2004         |
4 |  ббб |  ккккккк  |  м    | 18.09.1984         |
---------------------------------------------------------
а вот этот предложил XuMiX,
-------------------------------------------------------
id | Имя | Фамилия | Пол | Дата рождения |
1 |  ааа | иииииии | ж    | 10.06.2004         |
3 |  ббб |  зззззззз  |  м    | 15.01.2004         |
---------------------------------------------------------

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

Исправлено Stell Hawk (24.06.07 09:46)

Offline

#10  24.06.07 11:55

Re: [mysql] поиск одинаковых записей в таблице

Stell Hawk, я зато проверял, все работает правильно

Offline

#11  24.06.07 13:13

Re: [mysql] поиск одинаковых записей в таблице

ну я не хотел, но всё таки, пришлось поставить
исходная таблица:

id  name  fio  gender  date 
      1 aaa aaaa 'М' 2007-06-24 13:10:58
      2 aaa bbbb 'М' 2007-06-24 13:10:58
      3 ccc ddd 'М' 2007-06-24 13:11:25
      4 ccc ffff 'М' 2007-06-24 13:11:25
      5 eeeeee eeeeeeee 'М' 2007-06-24 13:11:42
      6 eeeeee eeeeeee Ж 2007-06-24 13:11:42

-------------------------------

SELECT name, gender, count( 1 ) AS cnt
FROM personal
GROUP BY name, gender
HAVING cnt >1

name  gender  cnt 
aaa 'М' 2
ccc 'М' 2

--------------------------------

SELECT p1. *
FROM Personal AS p1
JOIN Personal AS p2 ON ( p2.name = p1.name
AND p2.gender = p1.gender )
WHERE p2.id != p1.id

id  name  fio  gender  date 
      1 aaa aaaa 'М' 2007-06-24 13:10:58
      2 aaa bbbb 'М' 2007-06-24 13:10:58
      3 ccc ddd 'М' 2007-06-24 13:11:25
      4 ccc ffff 'М' 2007-06-24 13:11:25

Исправлено Stell Hawk (24.06.07 13:15)

Offline

#12  24.06.07 17:02

Re: [mysql] поиск одинаковых записей в таблице

Почемуж костыль, нормальный запрос с дистинктом.

Андрей Хаммер, мне мой запрос все-таки не нравится. Например, в таблице группа из n одинаковых по условию задачи записей, мой запрос без DISTINCT вернет n(n-1) строк для записей из этой группы, потом уже DISTINCT обрежет повторяющиеся и получится нужный результат.
Оверхед некислый получается. Потому и костыль.

Offline

#13  24.06.07 18:51

Re: [mysql] поиск одинаковых записей в таблице

Группировка не позволит вернуть идентификаторы дубликатных записей. Например, когда их надо грохнуть.
Вот тут и нужен будет join.

Исправлено dotnet (24.06.07 18:52)

Offline

#14  24.06.07 19:30

Re: [mysql] поиск одинаковых записей в таблице

и тут на помощь GROUP BY'ю выдвинется GROUP_CONCAT, оставив не у дел тупой JOIN.

Offline

#15  24.06.07 22:56

Re: [mysql] поиск одинаковых записей в таблице

Stell Hawk, ок, просто я, возможно, недопонял задачу
моя вариант вывел имена, которые повторяются, а не сами записи, да

Offline

#16  25.06.07 12:12

Re: [mysql] поиск одинаковых записей в таблице

XuMiX, я об этом и написал, запрос выводящий просто повторяющиеся записи простЖ-). а решение этой задачи это уже плюсик ж-). у самого н асобеседованиях три раза спрашивали его.
а вот на счет GROUP_CONCAT и JOIN тупого надо ещ провести тестирование кто из них тупееЖ-), синтаксческий разбор внутри сервера будет разный, и кто будет быстрее надо еще затеститьж-)

Offline

#17  25.06.07 17:50

Re: [mysql] поиск одинаковых записей в таблице

Stell Hawk, не говоря уже о том, кто из них более переносим на другие СУБД :)

Offline

#18  25.06.07 19:49

Re: [mysql] поиск одинаковых записей в таблице

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

вы еще соцопрос среди операндов SQL проведите, и путем общего тайного голосования определите, кто из них круче всех.

а задачка на собеседовании - это просто для отметания совсем тупых, кто даже в мануал не заглядывал, гордится подобной ерундой - из разряда детских комплексов.

Offline

#19  26.06.07 18:20

Re: [mysql] поиск одинаковых записей в таблице

берите пример с меня, я не знаю как сделать такой запрос и не хожу на собеседования, где его задают :)
кто-нибудь знает, в постгресе есть зачуханский group_concat или все нужно делать через CREATE AGGREGATE?

Offline

#20  26.06.07 20:54

Re: [mysql] поиск одинаковых записей в таблице

Матрим жжот) Первак, па-любому)))

а если серьезно, я сейчас так мучаюсь без мускуловских функций, plpgsql в этом отношении где-то гибче, где-то лучше, но первое время жутко мучался с привилегиями.

Offline

Программирование и БД » [mysql] поиск одинаковых записей в таблице 

ФутЕр:)

© Hostel Web Group, 2002-2024.   Сообщить об ошибке

Сгенерировано за 0.054 сек.
Выполнено 14 запросов.