#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
#5 22.06.07 11:39
Re: [mysql] поиск одинаковых записей в таблице
Возможно. Там на самом деле надо бы DISTINCT добавить, но это уже костыль.
Offline
#6 23.06.07 22:16
Re: [mysql] поиск одинаковых записей в таблице
Maq, почему это то жесть это классический запрос. причем бывает нужен в жизни . и на многих собеседавниях на такой запрос акцент делают
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
#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
#14 24.06.07 19:30
#15 24.06.07 22:56
#16 25.06.07 12:12
Re: [mysql] поиск одинаковых записей в таблице
XuMiX, я об этом и написал, запрос выводящий просто повторяющиеся записи простЖ-). а решение этой задачи это уже плюсик ж-). у самого н асобеседованиях три раза спрашивали его.
а вот на счет GROUP_CONCAT и JOIN тупого надо ещ провести тестирование кто из них тупееЖ-), синтаксческий разбор внутри сервера будет разный, и кто будет быстрее надо еще затеститьж-)
Offline
#17 25.06.07 17:50
#18 25.06.07 19:49
Re: [mysql] поиск одинаковых записей в таблице
речь не о переносе, а о решении конкретной задачи под конкретные условия. выдумать можно и ракету на луну.
вы еще соцопрос среди операндов SQL проведите, и путем общего тайного голосования определите, кто из них круче всех.
а задачка на собеседовании - это просто для отметания совсем тупых, кто даже в мануал не заглядывал, гордится подобной ерундой - из разряда детских комплексов.
Offline