Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL - две таблицы: юзеры и их друзья, как запросить все одним запросом? 
:(
    Опции темы
0xDEAD
Дата 22.6.2010, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: нет
Всего: 3



Добрый день!

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

Код

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

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


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

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

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


Спасибо!
PM MAIL   Вверх
Frees
Дата 22.6.2010, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 2
Всего: 54



Код

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


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
0xDEAD
Дата 22.6.2010, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: нет
Всего: 3



В моем случае 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 нужен свой первичный ключ

Зачем?

Это сообщение отредактировал(а) 0xDEAD - 22.6.2010, 09:41
PM MAIL   Вверх
tusha
Дата 22.6.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: 1
Всего: 1



Цитата

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


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

Это сообщение отредактировал(а) tusha - 22.6.2010, 10:06
PM MAIL   Вверх
Gluttton
Дата 22.6.2010, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



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

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

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


--------------------
Слава Україні!
PM MAIL   Вверх
Zloxa
Дата 23.6.2010, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



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

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

Если бы я бы имел основания полагать что платформа реализации ТС - оракл, я бы присоединился к этому вопросу. В оракле есть ROWID Pseudocolumn , который позволяет отказаться от ПК для таблиц которые не являются мастером в отношениях, и эти ПК нахрен не нужны как ограничения целостности.



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 23.6.2010, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



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

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

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

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

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




--------------------
Слава Україні!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0676 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.