Многотабличные (сложные) запросы.
#6

Quote:
Originally Posted by Urukhay
Посмотреть сообщение
Приветствую, друзья. Меня интересует постановка одного запроса, я сейчас напишу, а вы поправите..
Суть: у нас есть имя Вася, и в первой таблице на этом имени есть свой ключ(id). Нам надо получить всё из таблицы, в которой есть имя Вася, попутно получив из неё значение ключа, потом обратится с этим ключом в другую таблицу, и извлечь все по этому ключу.
pawn Код:
SELECT first_table.* WHERE name='Vasya', first_table.id = ID,
second_table.* WHERE second_table.id = ID
Это первое. Второе, в каком виде будет выглядеть ответ по данному запросу? Ну то есть понятно, в однотабличном запросе сортируются по очереди строчки одной таблицы. А как тут?
В языке SQL имеется специальный оператор для объединения таблиц по ключам, а именно INNER JOIN. И весь смысл его использования в том, чтобы убрать суматоху из запроса. Вот как тогда будет выглядеть запрос к двум таблицам:
Код:
SELECT *
FROM first_table a 
INNER JOIN second_table b
ON a.id=b.id
WHERE a.name='Vasya'
Т.о. сравнение ключей происходит в отдельном месте и не засоряет условие WHERE. Красота! К столбцам же при таком запросе следует обращаться с названием таблиц (firtst_table.id, second_table.id и т.п.).
Для объединения трёх и более таблиц формат INNER JOIN таков:

Код:
SELECT * FROM t1 INNER JOIN (t2, t3, t4)
                 ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c) WHERE t1.name='Vasya'
Насчёт других видов JOIN (LEFT JOIN, CROSS JOIN и т.д.) можно не заморачиваться, а пользоваться только INNER JOIN. В подавляющем большинстве случаев этого достаточно.
Да, и по поводу автоинкремента: если ты создаёшь несколько таблиц и связываешь их столбцы по ключу, то инкремент ключевого поля должен присутствовать только в одной из этих таблиц! А остальные же получают значение ключевого поля исходя из таблицы с инкрементом. Например:
Код:
Таблица palyers содержит инкремент поля id:
id name passwd ip
1 Vasya 12345 127.0.0.1
2 Alex  qwerty 95.132.11.59

Таблице scores инкремент не нужен!
id score
2 15
1 1000
Создание уникального ключа для поля id в таблице scores - обязательно!
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 2 Guest(s)