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

Приветствую, друзья. Меня интересует постановка одного запроса, я сейчас напишу, а вы поправите..
Суть: у нас есть имя Вася, и в первой таблице на этом имени есть свой ключ(id). Нам надо получить всё из таблицы, в которой есть имя Вася, попутно получив из неё значение ключа, потом обратится с этим ключом в другую таблицу, и извлечь все по этому ключу.
pawn Код:
SELECT first_table.* WHERE name='Vasya', first_table.id = ID,
second_table.* WHERE second_table.id = ID
Это первое. Второе, в каком виде будет выглядеть ответ по данному запросу? Ну то есть понятно, в однотабличном запросе сортируются по очереди строчки одной таблицы. А как тут?
Reply
#2

И еще, бред с Auto_Increment. Если удалить строку, то ее ID не займется уже.
Reply
#3

как то так
Код:
SELECT ft.*, st.* FROM second_table st, first_table ft WHERE ft.name='Vasya' AND st.id = ft.id
Quote:

Второе, в каком виде будет выглядеть ответ по данному запросу? Ну то есть понятно, в однотабличном запросе сортируются по очереди строчки одной таблицы. А как тут?

например first_table имеет столбцы: id, name, level
a second_table: id, gun, ammo
то мы получим:
id | name | level | id | gun | ammo
если не хотите чтобы они повторялись вызывайте только те столбцы которые надо и давайте им своё имя, например:
Код:
SELECT ft.id as ft_id , ft.name as ft_name, st.id as st_id и тд. FROM second_table st, first_table ft WHERE ft.name='Vasya' AND st.id = ft.id
Reply
#4

Понятно. Но судя по всему будет оптимальней получить ID в серверную переменную, потом по ней делать запрос во вторую таблицу. Так и понятней и меньше суматохи будет. Верно?
Reply
#5

Quote:
Originally Posted by Urukhay
Посмотреть сообщение
Понятно. Но судя по всему будет оптимальней получить ID в серверную переменную, потом по ней делать запрос во вторую таблицу. Так и понятней и меньше суматохи будет. Верно?
Ну как вам удобнее, так и делайте )
Reply
#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
#7

Quote:
Originally Posted by Bombo
Посмотреть сообщение
В языке SQL имеется специальный оператор для объединения таблиц по ключам, а именно INNER JOIN.
Это два оператора!
Quote:
Originally Posted by Bombo
Посмотреть сообщение
Для объединения трёх и более таблиц формат 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'
Вы показали частный случай, на самом деле все сложнее.
Reply
#8

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Это два оператора!
Эти два оператора я объединил в один намеренно, дабы не сбивать людей с толку и не погружать их в дебри возможностей оператора JOIN.

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Вы показали частный случай, на самом деле все сложнее.
Для всех запросов, которые только можно встретить в обсуждениях на этой ветке форума, такого частного случая вполне достаточно! А если совсем немного пошевелить извилинами, то можно равить этот случай до любого другого. Мне лишь хотелось показать, насколько упрощается выражение, стоящее после WHERE, при использовании JOIN.
Reply
#9

Спасибо за объяснение, Bombo.

Еще вот, почему AutoIncrement не создает на удалённый ID новую строку, то есть если мы удалим строку с ID 2, то он не создаст уже строку с таким ID.


А есть запрос вроде этого - "Извлечь всё, кроме столбца ID"?
Reply
#10

Quote:
Originally Posted by Urukhay
Посмотреть сообщение
Спасибо за объяснение, Bombo.

Еще вот, почему AutoIncrement не создает на удалённый ID новую строку, то есть если мы удалим строку с ID 2, то он не создаст уже строку с таким ID.


А есть запрос вроде этого - "Извлечь всё, кроме столбца ID"?
потому что это основа кореляционных баз данных. И забудьте навсегда все мысли о попытках исправить порядок или изменить принцип установки таких полей!
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)