Определите, существует ли комбинация записей «много ко многим»

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

Сценарий таков: у меня есть две таблицы A и B, которые разделяют отношения «многие ко многим». Таким образом, у меня есть таблица A_B с внешними ключами, которая сопоставляет отношения записи A-to-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.

ура

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

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

И вы планируете вставлять ONE A-Record в сочетании с n B-Records? Почему бы и нет – если новые значения 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, который вы не должны вставлять снова … ИЛИ пустой результат (все записи новы).

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

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

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

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.

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

ура