n: m выбор всех сущностей в n, которые имеют более одного FK в отношениях - PullRequest
0 голосов
/ 07 сентября 2011

У меня есть таблицы A и B, которые имеют отношение n: m.Итак, у меня есть таблица C для хранения пар внешних ключей A и B. Мне нужен запрос, который дает мне все записи из A, которые имеют пару с 2 или более атрибутами в B. Пример.Первый - это второй идентификатор для всех атрибутов, которые могут иметь таблицы.

+-----------+
|     A     |
+-----------+
| 1 fields  |
| 2 fields  |
| ...       |
| n fields  |
+-----------+

+-----------+
|     B     |
+-----------+
| 1 fields  |
| 2 fields  |
| ...       |
| n fields  |
+-----------+

+-----------+
|     c     |
| FKA | FKB |
+-----------+
| 1      2  | <-
| 2      2  | <-
| 2      3  |
| 1      4  | <-
| 2      4  | <-
| 3      2  |
| 6      4  |
+-----------+

Как выбрать все наборы данных в A, которые имеют отношение к набору данных 2 И 4 в таблице B?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2011

Здесь помогает объединение:

SELECT *
FROM A RIGHT OUTER JOIN B ON A.ID = B.ID

Это базовый SQL, который вам понадобится, и наоборот, вы можете сделать

SELECT *
FROM B LEFT OUTER JOIN A ON A.ID = B.ID
0 голосов
/ 07 сентября 2011

По сути, вы просите получить все идентификаторы из таблицы A, которые имеют две или более записей в таблице C, поэтому вы можете использовать:

SELECT COUNT(1) AS cnt, FKA 
FROM c 
GROUP BY FKA 
    HAVING cnt >= 2

Я не уверен, что правильно понимаю, но я думаю, что вам также нужен список всех значений FKB, которые есть в таблице C для каждого FKA, для которых вы можете использовать:

SELECT COUNT(1) AS cnt, FKA, GROUP_CONCAT(FKB SEPERATOR ",")
FROM c 
GROUP BY FKA 
    HAVING cnt >= 2

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

EDIT; ответ на реальный вопрос (надеюсь) Предположим, у вас есть список из 4 идентификаторов таблицы B (т.е. 1, 4, 67 и 133), и вы хотите знать, какие идентификаторы таблицы A ссылаются на все эти; Вы можете использовать:

SELECT COUNT(1) AS cnt, FKA 
FROM c 
WHERE (FKB = 1 OR FKB = 4 OR FKB = 67 OR FKB = 133)
GROUP BY FKA 
    HAVING cnt = 4

Это работает, только если комбинация FKA и FKB уникальна в таблице c (что в любом случае было бы хорошей практикой).

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