Соединение 3 таблиц с использованием SQL с использованием UNION / INNER JOIN для рисования данных - PullRequest
2 голосов
/ 28 ноября 2011

У меня есть 3 таблицы: пользователь, группы и группы пользователей.

Группы пользователей содержат идентификатор пользователя и группу идентификатора группы.

У пользователя есть id_user, а у группы есть id_group.

Мой вопрос будет:

Как извлечь данные из всех 3 таблиц для достижения следующего:

  1. Список всех групп в таблице групп
  2. Список групп в таблице UserGroup, которая была выбрана
  3. Список пользователей, которых нет в группах пользователей в таблице пользователей.
  4. Список пользователей, принадлежащих группе в таблице групп пользователей.

У меня есть следующие операторы SQL, но я бы хотел объединить их в оператор 1 sql. Возможно ли это?

select * from grupos

и

SELECT DISTINCT usuarios.id_usuario
FROM usuarios
WHERE usuarios.id_usuario
NOT IN (SELECT DISTINCT id_usuario FROM usuarios_grupos)

При этом первый запрос отображает:

Groups
  1. John
  2. Тим
  3. Jane

Второй запрос показывает следующее:

User
 1. John
 2. Jane
 3. Tom

User Group
 Empty

After selection of John:

User
 2. Jane
 3. Tom

User Group
 1. John

Instead of having the following (which I have now):

User

 1. John
 2. Jane
 3. Tom

After Selection of John:

UserGroup

 1. John

Подобно тому, что я продемонстрировал выше, если я выберу группу и пользователя и добавлю их в группы пользователей. Пользовательские группы будут отображать «Группа, Пользователь». (Например, развитие, Том).

Однако таблица данных групп будет по-прежнему отображаться следующим образом:

  1. Разработка
  2. Web
  3. Проекты

Вместо этого таблица данных пользователя будет «обновлена»:

  1. Тим
  2. Джейн.

Я попробовал следующее, но не получил желаемых результатов:

SELECT grupos.id_grupo, usuarios.id_usuario
FROM  usuarios_grupos
INNER JOIN
grupos
ON
usuarios_grupos.id_grupo = grupos.id_grupo
INNER JOIN
usuarios
ON
usuarios_grupos.id_usuario = usuarios.id_usuario
WHERE
usuarios.id_usuario
NOT IN (SELECT DISTINCT id_usuario FROM usuarios_grupos)

1 Ответ

0 голосов
/ 28 ноября 2011

Самый простой способ перечислить группы, в которые входят пользователи, это:

SELECT DISTINCT id_grupo FROM usuarios_grupos

Самый простой способ перечислить группы, у которых нет , принадлежащие им пользователи.будет:

SELECT DISTINCT id_grupo 
FROM grupos
WHERE id_grupo
NOT IN (SELECT DISTINCT id_grupo FROM usuarios_grupos)

РЕДАКТИРОВАТЬ: для отображения списка пользователей, которые не входят в группы, и всех групп, в которых есть пользователи, вы можете объединить результаты запросов, которые возвращают каждый из этих наборов -

SELECT DISTINCT id_usuario
FROM usuarios
WHERE id_usuario
NOT IN (SELECT DISTINCT id_usuario FROM usuarios_grupos)
UNION ALL
SELECT DISTINCT id_grupo FROM usuarios_grupos

Или вы можете сделать это в одном запросе:

SELECT DISTINCT COALESCE(ug.id_grupo, u.id_usuario)
FROM usuarios u
LEFT JOIN usuarios_grupos ug ON u.id_usuario = ug.id_usuario

(В этом последнем запросе предполагается, что между группами и наборами идентификаторов пользователей нет совпадений.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...