SQL запрос. Как делать SELECT с условием SELECT
Приветствую.
Есть 3 таблицы. books хранит данные о книге user_books хранит данные id из book и id из users, то есть каждый пользователь из users может соответствовать одному или нескольким id из books users хранит данные о пользователях. Когда мне нужны книги пользователя из books (тоесть полные данные о книге) я вынужден : 1. Выбрать id пользователя из users т.к. единственная доступная инфа о пользователе: сессия с именем пользователя. 2. Выбрать из user_books все книги пользователям по id пользователя. 3. Выбрать из books данные по книгам по id книг полученные из предыдущего запроса (книг от 1...99 ). Как можно сделать один такой запрос, например: Код:
SELECT * FROM `books` WHERE `id`=' МОЖНО ЭТО СДЕЛАТЬ? П.С. Можно получать id пользователя и в сессии, но тогда все равно остается запрос в запросе. Буду благодарен за ссылку или пример. Спасибо. |
не вникал в то, что ты хочешь, но если хочешь получить конкретное значение при помощи выборки, то запрос (select) должен вернуть ровно одно значение, а сам он помещён в круглые скобки, если же идёт выборка из выборки, то не важно сколько значений вернёт выборка, но она должна быть помещена в круглые скобки
|
Спасибо за ответы.
Получилось вот что: SELECT * FROM books b, user_books u, users s WHERE b.id = u.id_book AND u.id_user = s.id AND s.id = 76 Только не совсем ясно как сделать иначе? Потому что: 1. Выбираем все книги которые имеют хозяина 2. из числа выбранных всех изеров которые имеют книги 3. потом оставляем только те книги которые соответсвуют id юзера. Не слишком ли это затратно, если скажем обьем базы будет 50 мб? Или всеже так делать норм? |
Цитата:
select * from user_books as ub left join books as b on b.id=ub.id_book where ub.id_user=76 |
Цитата:
|
Спасибо.
Ответ гражданина Ksa в 2 раза быстрее чем мой вариант. |
ksa, зачем внешнее соединение?
если соответствие не поставлено, то и книга не пользователя и пользователь не книги :) --полные данные о книгах пользователя 76 SELECT * FROM books, user_books WHERE books.id = user_books.id_book AND user_books.id_user = 76 и декартова произведения здесь нет, так как есть ограничивающие условия |
Цитата:
Т.о. рассматриваются все (!) записи из books и все (!) записи из user_books. После чего к декартову квадрату применяется твое условие. Соединение же работает несколько иначе... Из user_books возьмутся только записи удовлетворяющие условию и к ним "присоединиться" запись из books согласно условию соединения. Т.о. ожидается более быстрый ответ. Цитата:
|
Цитата:
предполагаю, что в приведённом мною запросе, это, как минимум, означает, что анализатор, не в последнюю очередь, выполнит второе условие, тем самым уже избавив от декартова произведения Цитата:
|
Цитата:
Цитата:
|
Цитата:
Т.е. декартовы квадраты, кубы и пр. они оптимизировали... А про соединения наверное забыли и они там работают медленнее? :blink: |
В любом случае автор может рассказать как отработали наши примеры и выбрать более оптимальный по скорости...
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Код:
select Код:
SELECT * |
Цитата:
Цитата:
Цитата:
Цитата:
|
В T-SQL или PL-SQL есть совпадение с неоднозначной выборкой. Может и MySQL так сработает:
SELECT * FROM books WHERE id in ( SELECT id_books FROM user_books WHERE id_user=( SELECT id_user FROM users WHERE user_name=$_SESSION[''Name']) ) |
Вариант без join это join по-ораклу. С декартами они там сами разбираются, нас это николебет. Вариант с join - соответственно ANSI.
В трех таблицах запутаться невозможно по определению. Но вот что интересно. ТС не знает как составить запрос для трех отношений, но уже научился блатным аккордам, в смысле псевдонимам без идентификаторов. |
Часовой пояс GMT +3, время: 11:36. |