SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.07.2011 14:38:25

NaFigator
Участник
Зарегистрирован: 14.07.2011
Сообщений: 5

Непонятки с Join и вложенными запросами

Доброго времени суток.
Есть задача, но я к сожалению плохо представляю как ее решить smile
По сути требуется азимут в какую сторону гуглить. Помогите пожалуйста.

Задача:
есть три таблицы: users, gifts, mesages

Пытаюсь понять как вынуть из трех таблиц данные по одному юзеру.
Собственно камень зарыт в месте, где нужно получить все сообщения и все подарки для одного юзера.
Пробовал делать Join разных видов, но вынимается для одного юзера один подарок и одно сообщение.

Хотя возможно я както неверно обрабатываю данняе в PHP.

пробовал так
1:

SELECT gu.*, ud.*, um.*
FROM ".USERS." gu
LEFT JOIN ".GIFTS." ud ON gu.user_id=ud.user_id
LEFT JOIN ".MESSAGES." ud ON gu.user_id=um.user_id
WHERE gu.user_name = :name


2.
SELECT user_id, user_name, (SELECT * FROM ".GIFTS." WHERE user_name=:name) AS gifts_arr
FROM ".USERS." WHERE user_name = :name



в PHP работаю с базой через PDO но врядли это существенно smile

Отредактированно NaFigator (14.07.2011 15:11:05)

Неактивен

 

#2 14.07.2011 14:39:41

NaFigator
Участник
Зарегистрирован: 14.07.2011
Сообщений: 5

Re: Непонятки с Join и вложенными запросами

второй пример так до ума и не довел...показал лишь концепцию как пробовал.

Самое интересное как это вообще правильнее то делать? и почему.

Неактивен

 

#3 18.07.2011 14:43:54

NaFigator
Участник
Зарегистрирован: 14.07.2011
Сообщений: 5

Re: Непонятки с Join и вложенными запросами

Да я смотрю это прям оживленный форум smile

Неактивен

 

#4 18.07.2011 14:52:04

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Непонятки с Join и вложенными запросами

В первом запросе у вас будут все пары подарок - сообщение. То есть если 3 сообщения и 5 подарков, то будет в итоге 15 строк. Если получаете 1 строку, значит вы только ее и выводите в PHP.

JOIN делает не то, что вы ожидаете. Вы ожидаете такое
Петр подарок1 подарок2 сообщение1 сообщение2

Но такой вывод противоречит конфепту реляционных БД. На самом деле JOIN делает так:
Петр подарок1 сообщение1
Петр подарок1 сообщение2
Петр подарок2 сообщение1
Петр подарок2 сообщение1

JOIN это не пристыковка таблиц, а всевозможные пары A,B, где A - строка из первой таблицы, B - строка из второй таблицы.

Правильно будет одним запросом получить все подарки, а вторым запросом - сообщения. При этом запросы с JOIN такие же, как вы описали, но иначе обработать в PHP.

Неактивен

 

#5 18.07.2011 17:48:24

NaFigator
Участник
Зарегистрирован: 14.07.2011
Сообщений: 5

Re: Непонятки с Join и вложенными запросами

ага, про Join стало яснее (плюс погуглил и поэкспериментировал).
А что насчет вложенных запросов? Разве нельзя каким то образом в переменную получить массив нужных строк?
Чтото вроде того:

(SELECT * FROM ".GIFTS." WHERE user_name=:name) AS gifts_arr

Неактивен

 

#6 18.07.2011 17:55:53

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Непонятки с Join и вложенными запросами

Типа массив в MySQL нет. В переменной может быть только один из встроенных типов.

Можно, однако, сделать конкатенацию необходимых строк.

SELECT user_id, user_name, (SELECT GROUP_CONCAT(title) FROM ".GIFTS." WHERE user_name=:name) AS gift_titles FROM ".USERS." WHERE user_name = :name

Неактивен

 

#7 18.07.2011 18:06:33

NaFigator
Участник
Зарегистрирован: 14.07.2011
Сообщений: 5

Re: Непонятки с Join и вложенными запросами

спасибо за разъяснения. конкатенация тут врядли поможет.
Видимо придется вынимать данные несколькими запросами.

Неактивен

 

#8 19.07.2011 00:43:13

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Непонятки с Join и вложенными запросами

NaFigator, Покажите структуру ваших таблиц и пример результата который хотите получить.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson