Mysql. Связанные таблицы. Ниче не пойму.

Печать RSS
278

S
Автор
Землянин
0
1) Допустим, есть три таблицы. Юзеры(поля ид, имя и.тд.), Команда(в ней поля ид, ид юзера, ид группы), Группы(ид, название, и.т.д).
Задача - зная ид юзера вывести название группы.
Можно сначала узнать ид группы, потом название, двумя запросами. Но если идов таких 10 или более, получается куча запросов и большое время генерации. Как это всё в один впихнуть? Чтобы, например, вывести всех юзеров(не все есть в таблице команда) и рядом с ними вывести название группы.
2) допустим - гостевая. Та же ситуация, что и выше. Куча записей и надо вывести рядом с ником названия групп.
И, объясните, кто-нибудь про связанные таблицы вообще. Первичный ключ итд. Или линк подкиньте. Заранее спасибо.
Изменил: SD (13.03.2010 / 22:42)
C

Малиновые штаны
0
1. Dark Person, как я понял, то тебе надо делать запрос и выводить в цикле этот айди. а с помощью него в цикле делать запрос, и уже делать вывод. ну я лично так делаюsmile
S
Автор
Землянин
0
Дак а ты представь, если будет на странице 20 записей. 1 запрос на иды юзеров+20х1 запрос на узнавание ида группы+20х1 запрос на узнавание имени команды. Итого 41 запрос к бд. Нехило, да? Вот мне интересно, можно ли это в 1 запрос впихнуть, чтобы поле с именем из другой таблицы добавилось в результат запроса. Я так понимаю, надо юзать join, но вот вкурить его не могу..sad
О

Землянин
0
SELECT users.`*`, group.name FROM users 
LEFT JOIN group ON group.id = users.group_id
WHERE id_user = $id_user
ORDER BY users.id_user
Изменил: Олег (13.03.2010 / 23:31)
S
Автор
Землянин
0
Сам разобрался. Мож кому пригодится:
SELECT users.*, groups.title FROM users LEFT JOIN command ON command.user=users.id LEFT JOIN groups ON groups.id = command.status
Время запроса - 0.0050 сек..
В отличие от 0.0015+0.0016х4+0.0016х4=0.0143 сек.
З.ы. И это таблице юзеров было только 4 записи;)
Изменил: SD (14.03.2010 / 13:18)
A

Оранжевые штаны
0
можно было впринципе с внешним ключом подумать

Пацак
0
автор, ты бы структуру таблиц сменил, таблица, хранящая "Команда(в ней поля ид, ид юзера, ид группы)" и не нужна, просто добавляешь поле `group_id` в таблицу с юзерами и
select `users`.*, `groups`.`title`
from `users`
left join `groups` on `groups`.`id`=`users`.`group_id`
M

Оранжевые штаны
0
А индексы тут помогут?

Пацак
0
8, т.е.?
В

Чатланин
0
Aligan (14.03.10 / 04:26)
SELECT users.`*`, group.name FROM users 
LEFT JOIN group ON group.id = users.group_id
WHERE id_user = $id_user
ORDER BY users.id_user
Вот я ниразу не пользовался командой JOIN в запросах.. Я бы написал так:
SELECT users.name AS uname, group.name  AS gname 
 FROM users,group
 WHERE group.id=users.group_id
AND users.id='$id_user'
ORDER BY users.id
Вот скажите, мой запрос чем то хуже предыдущего? Или они одинаковы?
Изменил: Валерий (13.06.2010 / 00:14)
Стикеры / Теги / Правила / Топ тем / Топ постов / Поиск