powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выборка из 3-х связанных таблиц одним запросом
5 сообщений из 5, страница 1 из 1
Выборка из 3-х связанных таблиц одним запросом
    #34553246
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,
есть такие таблицы:

таблица пользователей (поле uid является ключевым)
Код: plaintext
1.
CREATE TABLE users(uid INTEGER, name VARCHAR( 32 ));

таблица групп (поле gid является ключевым)
Код: plaintext
1.
CREATE TABLE groups(gid INTEGER, name VARCHAR( 32 ));

таблица связей групп и пользователей (uid и gid определены как внешние ключи к соответствующим таблицам)
Код: plaintext
1.
CREATE TABLE uid2gid(uid INTEGER, gid INTEGER);


Решаю задачу выборки пользователя с определенным идентификатором и групп, принадлежащих этому пользователю.
Задачу выпонляю в несколько этапов:
1) читаю пользователя с uid=123
Код: plaintext
1.
SELECT uid, name FROM users WHERE uid= 123 ;

2) читаю информацию о связях пользователя uid=123 с группами:
Код: plaintext
1.
SELECT gid FROM uid2gid WHERE uid= 123 

3) и затем в цикле посылаю запросы таблице groups, в качестве условия выборки подставляю значения из запроса №2:
Код: plaintext
1.
SELECT gid, name FROM groups WHERE gid=?

----------------
Работает всё нормально но хотелось бы знать - можно ли данную задачу решить как то проще?
использую СУБД: MySQL 5.x
...
Рейтинг: 0 / 0
Выборка из 3-х связанных таблиц одним запросом
    #34555042
Waytac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильнее сказать не "групп, принадлежащих этому пользователю", а "группы, в которые входит пользователь".
Можно использовать JOIN в различных вариантах.
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT ug.uid, u.name, ug.gid, g.name
FROM uid2gid AS ug
  LEFT JOIN users AS u ON ug.uid = u.uid
  LEFT JOIN groups AS g ON ug.gid = g.gid
WHERE ug.uid =  123 
ORDER BY g.name

Если не нужна инфа о пользователе, то JOIN по users можно убрать (соответственно подправить и выбираемые поля).
...
Рейтинг: 0 / 0
Выборка из 3-х связанных таблиц одним запросом
    #34556113
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
супер! большое спасибо - это именно то что нужно! :)
...
Рейтинг: 0 / 0
Выборка из 3-х связанных таблиц одним запросом
    #34841037
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сейчас использую такой запрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT ug.uid, u.name, ug.gid, g.name
FROM uid2gid AS ug
  LEFT JOIN users AS u ON ug.uid = u.uid
  LEFT JOIN groups AS g ON ug.gid = g.gid
WHERE ug.uid =  123  
GROUP BY ug.uid, u.name, ug.gid, g.name
ORDER BY g.name

в результате выборки получается чтото наподобие:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
+-----+---------+-----+---------------+
| uid   | name     | gid   | name             | 
+-----+---------+-----+---------------+
|    9    | freddy    |    1    | member         
|    8    | clown     |    1    | member         
|    7    | megauser   |    1    | member         
|    6    | sidoroff   |    1    | member         
|    2    | ivanoff    |    1    | member         
|    1    | petroff    |    1    | member         
|    1    | petroff    |    2    | administrator  
|    1    | petroff    |    3    | root               
+-----+----------+-----+--------------+

скажите, как можно добавить в выборку еще один столбец, равный количеству элементов в группе..
чтобы получилась такая таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
+----+-----+---------+-----+---------------+
| cc   | name     | gid   | name             | 
+----+-----+---------+-----+---------------+
|   1     |    9    | freddy    |    1    | member         
|   1     |    8    | clown     |    1    | member         
|   1     |    7    | megauser   |    1    | member         
|   1     |    6    | sidoroff   |    1    | member         
|   1     |    2    | ivanoff    |    1    | member         
|   3     |    1    | petroff    |    1    | member         
|   3     |    1    | petroff    |    2    | administrator  
|   3     |    1    | petroff    |    3    | root               
+-----+-----+----------+-----+--------------+
тоесть поле cc - это количество элементов в группе..
...
Рейтинг: 0 / 0
Выборка из 3-х связанных таблиц одним запросом
    #34871412
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ладно, пошел по другому пути... теперь вот получился такой запрос, который работает как надо.
смущает размеры этого запроса.

Код: plaintext
1.
2.
3.
4.
5.
(SELECT g.gid, g.name, g.dsc, count(u.uid) FROM uid2gid AS ug  
JOIN users AS u ON ug.uid = u.uid 
LEFT JOIN groups AS g ON ug.gid = g.gid GROUP BY g.gid) 

UNION (SELECT gid, name, dsc,  0  FROM groups WHERE gid NOT IN (SELECT gid FROM uid2gid))

есть ли тут поле для оптимизации и минимизации? :)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выборка из 3-х связанных таблиц одним запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]