SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 08.09.2009 12:43:59

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

Выборка из 3 таблиц (многие ко многим)

http://raduga.uuuq.com/images/db.jpg  -  вот структура БД.
Необходимо составить запрос который вернёт массив Имен из таблицы "users" и соответствующие этому юзеру  имена групп из таблицы "groups", связи юзеров и групп находятся в таблице: "users_grous". т.е. в результате должен получиться массив содержащий в себе ещё массивы (групп для каждого пользователя): [Пользователь1 , [Группа1 , Группа2 , Группа3] ; Пользователь2 , [Группа2 , Группа4]]

Неактивен

 

#2 08.09.2009 14:20:14

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

Re: Выборка из 3 таблиц (многие ко многим)

У меня пока получился вот такой запрос:

SELECT users.id, users.name, groups.group_name
FROM users
LEFT JOIN users_groups ON users.id = users_groups.user_id
LEFT JOIN groups ON users_groups.group_id = groups.id



Но выводит он не то что я хотел бы, а в выводит записи отдельно для каждой группы одного и того же пользователя. Т.е. Если "Пользователь1" состоит в группах "Группа1" и "Группа2", то данный запрос вернёт 2 записи:
Пользователь1 - Группа1
Пользователь1 - Группа2

А нужно что бы возвращал 1 запись во второй ячейки содержащую массив:
Пользователь1 - [Группа1, Группа2]

Неактивен

 

#3 08.09.2009 14:42:55

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка из 3 таблиц (многие ко многим)

SELECT u.id, GROUP_CONCAT(g.group_name)
FROM users u
LEFT JOIN users_groups ug ON u.id = ug.user_id
JOIN groups g ON ug.group_id = g.id
GROUP BY 1

Неактивен

 

#4 08.09.2009 14:45:57

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

Re: Выборка из 3 таблиц (многие ко многим)

paulus написал:

SELECT u.id, GROUP_CONCAT(g.group_name)
FROM users u
LEFT JOIN users_groups ug ON u.id = ug.user_id
JOIN groups g ON ug.group_id = g.id
GROUP BY 1

Спасибо! Только вернулся не массив а строка разделенная Сепаратором sad
Можно ли вернуть именно массив?

Неактивен

 

#5 08.09.2009 14:54:13

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

Re: Выборка из 3 таблиц (многие ко многим)

Попробовал выполнить данный запрос в коде

Код:

$sql="
SELECT users.name,
GROUP_CONCAT(groups.group_name SEPARATOR '\n\r')
FROM users, groups, users_groups
WHERE users.id = users_groups.user_id and
groups.id = users_groups.group_id
GROUP BY users.name";
    $result = mysql_query($sql) or die("Ошибка при закросе к БД.");
    $row = mysql_fetch_array($result);
    var_dump($row);

Но в данном запросе не выводятся пользователи которые не находятся ни в одной из групп, мне нужно что бы выводились. Как можно доработать данный запрос?

Отредактированно jeka5555 (08.09.2009 15:10:49)

Неактивен

 

#6 08.09.2009 15:43:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка из 3 таблиц (многие ко многим)

«Другой запрос может привести к другим результатам». Больше добавить, пожалуй, нечего smile

А «массив» — это таблица. Можете читать отдельными запросами для каждого пользователя.

Неактивен

 

#7 08.09.2009 15:50:19

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

Re: Выборка из 3 таблиц (многие ко многим)

paulus написал:

А «массив» — это таблица. Можете читать отдельными запросами для каждого пользователя.

Не слишком ли это затратно!?

Неактивен

 

#8 08.09.2009 17:07:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка из 3 таблиц (многие ко многим)

Ну, Вы определитесь для себя — нужен ли вам агрегатный запрос, или нет. И выполняйте
только один из них — или тот, или другой — тогда будет не затратно smile

Неактивен

 

Board footer

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