3eta: (Default)
3eta ([personal profile] 3eta) wrote2012-09-29 11:55 am

аа, сдаюсь

SQL-оведы, помогите. Нужно сделать запрос, где мне очень хочется вставить цикл, но ведь наверное нельзя?
Звучит просто: выбрать из таблицы с именами и фамилиями людей, у которых фамилия такая же как у кого-либо другого имя. Все идеи закончились, ничего не работает (в том числе по каким ключевым словам гуглить возможные решения).

[identity profile] 3eta.livejournal.com 2012-09-29 11:17 pm (UTC)(link)
спасибо! мне как раз поверхностно и не хватает, потому что я могу скопировать и применить чужой запрос, но мне бы понять принцип - как оно работает и почему стоит именно так

[identity profile] machin.livejournal.com 2012-09-29 11:35 pm (UTC)(link)
Давай я ещё попробую.

Представь, что тебе нужно решить задачу с одноименным отцом на бумаге.
(Вживемся в роль СУБД)
У тебя есть листок с таблицей
номер человека | ФИО | Дата рождения | Номер отца
Проблема в том, что ты можешь смотреть в один момент только на одну строчку таблицы. Зато можно заглядывать в другие таблицы, не забывая строчку из первой

Поэтому ты идешь к ксероксу и делаешь копию этого листа. Теперь у тебя две одинаковые копии одной таблицы. Ты помечаешь их как Тable1 и Тable2, чтобы не перепутать.

На этом этапе у нас есть запрос:
select * from table as table1, table as table2

Теперь можно приступить к решению непосредственно задачи.
Ты берешь первую строчку из первой таблицы и сравниваешь с каждой строчкой второй таблицы.
Что ты ищешь?
В первой таблице у нас сын, во второй таблице ты ищешь его отца.
Это означает, что ты берешь номер отца из первой таблицы и сравниваешь с просто номером из второй. Тебе подходят только пары, где эти два номера равны.

На этом этапе у нас есть запрос:
select * from table as table1, table as table2
WHERE table1.Father_Person_ID = table2.ID

Но в получившемся списке у тебя по-прежнему есть лишние пары!
Теперь при сравнении строчка-строчка ты проверяешь еще одно условие: имя отца и сына одинаковое.
Теперь у нас есть запрос
select * from table as table1, table as table2
WHERE table1.Father_Person_ID = table2.ID
AND table1.first name = table1.first name

Это и есть наш окончательный запрос.

Мы поставили AND, потому что нам нужно, чтобы оба условия выполнялись вместе.

И на всякий случай уточню: Тable1 и Тable2 - твои личные выдуманные пометки, ты могла их назвать sdgsdfgsdfgdsfg1 и gogogogog.

[identity profile] 3eta.livejournal.com 2012-09-29 11:50 pm (UTC)(link)
Супер, теперь все встало на свои места!
Спасибо большое.
А ты еще не спишь или уже не спишь? У вас там 2 ночи!

[identity profile] 3eta.livejournal.com 2012-09-30 12:35 am (UTC)(link)
что-то не то :-/
SELECT * FROM `People` as `table1`, `People` as `table2` WHERE `table1`.`Father_Person_ID` = `table2`.`Person_ID`
AND `table1`.`First_Name` = `table1`.`First_name`;
возвращает мне список всех людей у которых есть отцы, так же как мой предыдущий запрос со вложенным select-ом, непонятно где собака зарыта. перепроверила все названия колонок :-/