Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > SQL - две таблицы: юзеры и их друзья


Автор: 0xDEAD 22.6.2010, 08:21
Добрый день!

У меня есть две таблицы: юзеры, и их друзья, что выглядит примерно так:

Код

members
---+-----
id | name
---+-----
 1 | Вася
 2 | Петя
 3 | Катя

friends
---+-----
id | name
---+-----
 1 | Маша
 1 | Саша
 1 | Ваня
 2 | Рома
 2 | Галя


Я хочу за раз взять всех юзеров с друзьями, и их друзей.
Как мне это сделать одним запросом?

Нужно иметь в результате:
Код

Вася
  Маша
  Саша
  Ваня
Петя
  Рома
  Галя


Спасибо!

Автор: Frees 22.6.2010, 08:35
Код

SELECT 
  M.NAME MEMBERS,
  F.NAME FRIENDS
FROM MEMBERS M
LEFT JOIN FRIENDS F ON F.ID = M.ID


в таблице FRIENDS нужен свой первичный ключ

friends
id | memder_id |name

Автор: 0xDEAD 22.6.2010, 09:40
В моем случае join почему-то нереально долго думает
Код

SELECT id, members.name as m_name, friends.name as f_name 
FROM members 
LEFT JOIN friends USING(id) 
WHERE members.last_login<$time AND friends.hair_color='black'


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

Придумал альтернативу:
Код

SELECT members.id, members.name as m_name, friends.name as f_name 
FROM members, friends 
WHERE members.last_login<$time AND friends.id=members.id AND friends.hair_color='black'


В отличие от первого почему-то возвращает результат мгновенно.

Цитата(Frees @  22.6.2010,  08:35 Найти цитируемый пост)
в таблице FRIENDS нужен свой первичный ключ

Зачем?

Автор: tusha 22.6.2010, 10:04
Цитата

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


может создать некластерный индекс по дате логина? или если база мссскл то сделать эти 2 колонки как инклуд для индекса
(или вообще построить кластерный индекс по id, last_login - я так понимаю это таблица аудита - кто когда заходил в систему?) 

Автор: Gluttton 22.6.2010, 17:57
Цитата(0xDEAD @  22.6.2010,  09:40 Найти цитируемый пост)
Зачем?

Зачем первичный ключ вообще smile ?

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

Автор: Zloxa 23.6.2010, 09:16
Цитата(Gluttton @  22.6.2010,  17:57 Найти цитируемый пост)
Зачем первичный ключ вообще?

До тех пор, пока перед разрабом стоит вопрос "зачем", первичный ключ действительно не нужен.

Если бы я бы имел основания полагать что платформа реализации ТС - оракл, я бы присоединился к этому вопросу. В оракле есть http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns008.htm#SQLRF00254, который позволяет отказаться от ПК для таблиц которые не являются мастером в отношениях, и эти ПК нахрен не нужны как ограничения целостности.

Автор: Gluttton 23.6.2010, 21:05
Zloxa, 
Цитата(Zloxa @  23.6.2010,  09:16 Найти цитируемый пост)
До тех пор, пока перед разрабом стоит вопрос "зачем", первичный ключ действительно не нужен.

Дык а как же вообще без ключей? Что не пойму? Как обращаться к записям?

Ну и, как бы, я вообще не совсем понимаю как ТС пытается достич желаемого результата:
Цитата(0xDEAD @  22.6.2010,  08:21 Найти цитируемый пост)
Я хочу за раз взять всех юзеров с друзьями, и их друзей.

Цитата(0xDEAD @  22.6.2010,  08:21 Найти цитируемый пост)
У меня есть две таблицы: юзеры, и их друзья,

А как же друзья друзей smile ?
И я так понимаю друзья не могут быть юзерами, а юзеры не могут становиться друзьями?


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)