Определите, существует ли комбинация «многие ко многим» - PullRequest
0 голосов
/ 13 апреля 2011

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

Сценарий таков: у меня есть две таблицы A и B, которые разделяютотношения многие ко многим.Таким образом, у меня есть таблица A_B с внешними ключами, которая отображает отношения записи A-B.Стандартные вещи.

Все, что я пытаюсь выяснить, это как сделать запрос к таблицам, прежде чем я введу новую запись (одну запись «A» с одной или несколькими записями «B»), если совпадающие, идентичные отношенияуже существует.Цель состоит в том, чтобы не дублировать данные.

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

ОБНОВЛЕНИЕ

Ниже приведен пример запроса, который я пытался определить, существует ли существующая запись A, сопоставленная со значениями B_id 3, 4 и 5. Он работает, однако возвращает ложные срабатывания, если есть два различных значения A_id, которые охватывают3, 4 и 5, например:

  • A_id = 1, значения B_id = 2, 3
  • A_id = 2, значения B_id = 4, 5, 6
SELECT A_id, B_id
FROM A_B
GROUP BY
A_id HAVING
    B_id IN (3,4,5)
    AND
    COUNT(*) = 3
LIMIT 1

ОБНОВЛЕНИЕ 2

Первичный ключ таблицы A_B - это составной ключ, включающий A_id и B_id .

A_BТаблица определяет уникальный составной ключ, включающий A_id и B_id.

Один A состоит из одного или нескольких Bs.

Более общий способ сформулировать этот вопрос: заданный конечный набор идентификаторов B idзначения, я должен быть в состоянии определить, существует ли A, состоящий из этого точного набора Bs.Если нет, то создается новый A с этим набором Bs.

Cheers

Ответы [ 3 ]

1 голос
/ 13 апреля 2011

У вас действительно есть внешние ключи? Должен быть способ объявить эту комбинацию table1.key -> table2.key уникальной. Что приведет к обычной ошибке SQL при создании уже существующей пары записей. Это то, что мне нравится в наборе ключей. Это очень чисто, потому что сведения о (не) разрешенных записях остаются на уровне базы данных.

У вас есть таблица A_B, содержащая назначения, не так ли? A.id 88 принадлежит B.id 99 ... и т.д.?

А вы планируете вставить ОДНУ А-запись в сочетании с П-записями? Почему нет - если новые значения A = 99 и B: 10, 11, 12, 17, 18, 20

SELECT b_id
FROM A_B
WHERE a_id = 99
AND b_id IN (10, 11, 12, 17, 18, 20);

Это приведет к списку b_ids, которые вы не должны вставлять снова ... ИЛИ пустой результат (все записи новые).

1 голос
/ 13 апреля 2011

Почему бы просто не запросить таблицу, чтобы узнать, существуют ли существующие записи?

$query = "SELECT * from tableA_B WHERE columnA = A"
$result = mysql_query($query);
if( mysql_num_rows($result) > 1){
    //do something about having entries
}

Вам, очевидно, придется заменить имена таблиц и столбцов фактическими значениями, а также свой параметр поиска для A.

0 голосов
/ 25 июля 2012

GROUP_CONCAT на помощь!Учитывая значения B_id 1, 3 и 5, вот как вы (I) можете определить, существует ли эта уникальная комбинация, и одновременно получить соответствующий A_id:

SELECT A_id FROM A_B
GROUP BY A_id
HAVING GROUP_CONCAT(B_id) = '1,3,5';

Подзапросы не требуются и могут быть оптимизированы с помощьюдобавление составного индекса A_id_B_id к таблице A_B.

Спасибо участникам, которые присоединились и в конечном итоге направили меня в правильном направлении.

Приветствия

...