Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.07.2013, 21:51
Аватар для Duda.Ml1986@gmail.com
Профессор
Отправить личное сообщение для Duda.Ml1986@gmail.com Посмотреть профиль Найти все сообщения от Duda.Ml1986@gmail.com
 
Регистрация: 01.09.2011
Сообщений: 263

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`='
SELECT `id_books`FROM `user_books`WHERE `id_user`='
SELECT `id_user`FROM `users` WHERE `user_name`='$_SESSION[''Name']'' '
Естественно что такой запрос не работает, и при том что один из ответов может содержать более одного поля.

МОЖНО ЭТО СДЕЛАТЬ?

П.С. Можно получать id пользователя и в сессии, но тогда все равно остается запрос в запросе.

Буду благодарен за ссылку или пример.
Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 09.07.2013, 22:28
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

не вникал в то, что ты хочешь, но если хочешь получить конкретное значение при помощи выборки, то запрос (select) должен вернуть ровно одно значение, а сам он помещён в круглые скобки, если же идёт выборка из выборки, то не важно сколько значений вернёт выборка, но она должна быть помещена в круглые скобки

Последний раз редактировалось bes, 09.07.2013 в 22:32.
Ответить с цитированием
  #3 (permalink)  
Старый 10.07.2013, 00:22
Аватар для Duda.Ml1986@gmail.com
Профессор
Отправить личное сообщение для Duda.Ml1986@gmail.com Посмотреть профиль Найти все сообщения от Duda.Ml1986@gmail.com
 
Регистрация: 01.09.2011
Сообщений: 263

Спасибо за ответы.

Получилось вот что:

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 мб?
Или всеже так делать норм?
Ответить с цитированием
  #4 (permalink)  
Старый 10.07.2013, 09:11
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,227

Сообщение от Duda.Ml1986@gmail.com
Когда мне нужны книги пользователя из books (тоесть полные данные о книге)
Как вариант...

select
	*
from
	user_books as ub
    left join books as b on b.id=ub.id_book 
where
	ub.id_user=76
Ответить с цитированием
  #5 (permalink)  
Старый 10.07.2013, 09:12
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,227

Сообщение от Duda.Ml1986@gmail.com Посмотреть сообщение
Получилось вот что:

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
Делать декартов куб не продуктивно для решения твоей задачи...
Ответить с цитированием
  #6 (permalink)  
Старый 10.07.2013, 19:25
Аватар для Duda.Ml1986@gmail.com
Профессор
Отправить личное сообщение для Duda.Ml1986@gmail.com Посмотреть профиль Найти все сообщения от Duda.Ml1986@gmail.com
 
Регистрация: 01.09.2011
Сообщений: 263

Спасибо.
Ответ гражданина Ksa в 2 раза быстрее чем мой вариант.
Ответить с цитированием
  #7 (permalink)  
Старый 10.07.2013, 20:59
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

ksa, зачем внешнее соединение?
если соответствие не поставлено, то и книга не пользователя и пользователь не книги

--полные данные о книгах пользователя 76
SELECT * 
FROM books, user_books
WHERE books.id = user_books.id_book AND user_books.id_user = 76

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

Последний раз редактировалось bes, 10.07.2013 в 21:18. Причина: комментируя, описался на книге
Ответить с цитированием
  #8 (permalink)  
Старый 11.07.2013, 09:11
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,227

Сообщение от bes
и декартова произведения здесь нет
Оно там есть по определению... Просто к нему применяется условие.
Т.о. рассматриваются все (!) записи из books и все (!) записи из user_books. После чего к декартову квадрату применяется твое условие.

Соединение же работает несколько иначе...
Из user_books возьмутся только записи удовлетворяющие условию и к ним "присоединиться" запись из books согласно условию соединения.

Т.о. ожидается более быстрый ответ.

Сообщение от bes
если соответствие не поставлено, то и книга не пользователя и пользователь не книги
Это вообще не понял...
Ответить с цитированием
  #9 (permalink)  
Старый 11.07.2013, 19:20
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от ksa
Оно там есть по определению... Просто к нему применяется условие.
Т.о. рассматриваются все (!) записи из books и все (!) записи из user_books. После чего к декартову квадрату применяется твое условие.
насколько мне известно, более-менее серьёзные субд (такие как от oracle) используют различные внутренние оптимизации для ускорения получения результатов запроса, поэтому описываемый тобой способ реализации запроса на данный момент удобен лишь для освоения sql
предполагаю, что в приведённом мною запросе, это, как минимум, означает, что анализатор, не в последнюю очередь, выполнит второе условие, тем самым уже избавив от декартова произведения

Сообщение от ksa
Это вообще не понял...
я пояснил, что не вижу смысла оставлять лишние записи, которые ты потенциально оставил (если они есть), использовав внешнее соединение
Ответить с цитированием
  #10 (permalink)  
Старый 12.07.2013, 11:37
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,227

Сообщение от bes
не вижу смысла оставлять лишние записи, которые ты потенциально оставил
Автор использовал мой запрос - лишних записей там нет.

Сообщение от bes
описываемый тобой способ реализации запроса на данный момент удобен лишь для освоения sql
Это лишь твое мнение и не более того...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так, чтобы JS при нажатии на кнопку не выполняла запрос со страницы. JSProgrammer Элементы интерфейса 3 18.05.2010 20:18
Как сделать POST запрос? clickpincode Общие вопросы Javascript 2 18.03.2010 14:57
Как проверить что сервер безошибочно выполнил запрос php? PAMAC Серверные языки и технологии 7 20.02.2010 09:10
Как делать переменные имена свойств? khusamov Общие вопросы Javascript 2 04.08.2009 22:10
Как вывести на экран значение функции SELECT MAX(id) Владдд Серверные языки и технологии 3 25.01.2009 16:07