Соединить 4 таблицы в запросе SQL - PullRequest
4 голосов
/ 15 марта 2012

В моей базе данных есть 4 таблицы отношений, и я хочу присоединиться к ним, чтобы получить общую стоимость ... например, у меня есть друзья, семья, подписчики и знакомые, и я хочу присоединиться к ним, чтобы получить значение "ВСЕ".

Форматы таблиц:

Друзья

id follower following
---------------------
1     2      3
2     4      5

Семья

id follower following
---------------------
1     5      6
2     7      8

После

id follower following
---------------------
1     9      10
2     11     12

Знакомства

id follower following
---------------------
1     13     14
2     15     16

Правильный ли запрос для объединения всех 4 таблиц ...

SELECT following
FROM   friends
       INNER JOIN family ON friends.following=family.following
       INNER JOIN following ON friends.following=following.following
       INNER JOIN acquaintances ON friends.following=acquaintances.following
WHERE  follower='id'

По сути, я хочу присоединиться и получить значение "follow" из всех четырех таблиц, где id = my id

Ответы [ 5 ]

6 голосов
/ 15 марта 2012

Ваш текущий запрос будет отображать результаты только в том случае, если все таблицы имеют ссылку на вашу таблицу друзей.Я полагаю, что вы больше ищете что-то вроде этого

SELECT following
FROM   friends
WHERE  follower='id'
UNION ALL 
SELECT following
FROM   family 
WHERE  follower='id'
UNION ALL 
SELECT following
FROM   following
WHERE  follower='id'
UNION ALL 
SELECT following
FROM   acquaintances 
WHERE  follower='id'

или немного приятнее для чтения и проще в настройке за счет некоторой производительности

SELECT following 
FROM   (
        SELECT following, follower FROM friends
        UNION ALL SELECT following, follower FROM family 
        UNION ALL SELECT following, follower FROM following
        UNION ALL SELECT following, follower FROM acquaintances 
       ) AS f
WHERE  follower='id'

UNION

UNION используется для объединения результатов нескольких операторов SELECT в один набор результатов.

1 голос
/ 15 марта 2012

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

То, что вы хотите, это союз, как подсказывает другой ответ. Однако лучшим выбором может быть наличие одной таблицы отношений, в которой будет специальный столбец (enum?) Для определения ее типа вместо одной таблицы для каждого типа отношений.

1 голос
/ 15 марта 2012

Вы захотите сделать это:

SELECT following FROM friends WHERE follower='id'
UNION
SELECT following FROM family WHERE follower='id'
UNION
SELECT following FROM followers WHERE follower='id'
UNION
SELECT following FROM acquaintances WHERE follower='id'

Который даст

following
---------------------
3
4
6
8
10
12
14
16

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

0 голосов
/ 15 марта 2012

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

id follower following type
---------------------------------
1     5      6        Family
2     7      8        Friends
3     13     14       Acquaintance 
4     15     16       Friends

, затем вы можете фильтровать, заказать или группировать по type

0 голосов
/ 15 марта 2012

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

(SELECT following FROM friends WHERE follower='id')
UNION
(SELECT following FROM family WHERE follower='id')
UNION
(SELECT following FROM following WHERE follower='id')
UNION
(SELECT following FROM acquaintances WHERE follower='id')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...