2013-08-14 7 views
1

У меня есть некоторые проблемы с конкретным запросом mysql для конкретной конструкции.
Есть 2 таблицы:M: N отношение запрос

table users (id, username) 
table groups (id, groupname) 

этих 2 таблиц находятся в м: п отношения, но есть 2 таблицы для этого.

Во-первых, в картах пользователей к группам

table usertogroups (idmaster, idslave) 

где idmaster связана с users.id и idslave связано groups.id

Вторые карты групп пользователей

table groupstouser (idmaster, idslave) 

где idmaster относится к groups.id. idslave относится к users.id

Depe в приложении он не может быть изменен.

Теперь я хочу получить все группы с зависимыми пользователями в одном запросе с отношением как table, groupstouser, так и usertogroups.
Я пробовал много операторов, но если я возьму вторую таблицу, это не сработает.

Любые полезные идеи?

+0

Вы можете использовать союз. –

+0

Вам нужно избавиться от одной из этих двух таблиц ассоциаций. Логически каждый из них является зеркальным отображением другого. Это избыточно, бесполезно, и это может быть источником ошибок, если таблицы не поддерживаются в идеальной синхронизации. –

+1

Два замечания: (1) «Зависит от приложения * его нельзя было изменить *». Возможно, это невозможно изменить * в это время. Но вы должны окончательно отказаться от потупления этой глупости. * Отношения * не * указатели *. Они носит двунаправленный характер. Тот, кто пришел к этому «решению», мог бы либо не понимать базы данных * реляционных *, либо здесь есть определенные тонкости, которые на первый взгляд не очевидны? (2) «Я пробовал много заявлений, но [...] он не работает », не могли бы вы показать некоторые из своих заявлений? Еще раз« на первый взгляд »это просто« ПРИСОЕДИНЯЙТЕСЬ »... –

ответ

0

Я не уверен, это может решить вашу проблему:

(SELECT * FROM usertogroups WHERE idmaster=10) 
UNION 
(SELECT * FROM groupstouser WHERE idslave=10) 
0

Я думаю, что ваш проект базы данных является неправильным.

Когда user присвоен group, для него может использоваться только одна таблица. Вы должны сохранять повторяющиеся записи как в usertogroups, так и в groupstouser.

Попробуйте получить данные только из одной таблицы.

SELECT * FROM usertogroups order by idslave 

Если я не прав, что вы не сохранение дубликатов данных в обеих таблицах, то указать причину наличия двух таблиц

+0

Нет, я не сохранил повторяющиеся данные. дизайн приложения исправлен, поэтому я использую там данные и пытаюсь сгенерировать отчет. –

+0

@MarcoKohn «Нет, я не сохранил повторяющиеся данные». Вы должны окончательно объяснить в своем вопросе, почему 'usertogroups' и' groupstouser' отличаются друг от друга Возможно, показывая пример фактических данных. Это очень возмутительно - и может привести к субоптимальным ответам на вашу проблему. –

1

Используйте это как вложенное представление, чтобы получить данные из обеих таблиц ассоциации:

((SELECT idmaster AS userid, idslave AS groupid FROM userstogroup) 
UNION 
(SELECT idslave AS userid, idmaster AS groupid FROM groupstouser)) all_associations 

Тогда вы можете запросить так:

SELECT groups.groupname, users.username 
FROM groups 
INNER JOIN ((SELECT idmaster AS userid, idslave AS groupid FROM userstogroup) 
      UNION 
      (SELECT idslave AS userid, idmaster AS groupid FROM groupstouser)) all_associations 
ON groups.id = all_associations.groupid 
INNER JOIN users 
ON users.id = all_associations.userid 

И вот SQL Fiddle.

+0

Thnaks Miklos, он отлично работает. В моих тестах проблема заключалась в создании на встроенном представлении. он работает. –

+2

Рад, что я мог помочь. Пожалуйста, отметьте мой ответ, как принято, чтобы закрыть свой вопрос. –

Смежные вопросы