Это похоже на то, что это была бы простая задача с простым решением, но я пришел с пустыми руками как в StackOverflow, так и в Google.
Сценарий таков: у меня есть две таблицы A и B, которые разделяют отношения «многие ко многим». Таким образом, у меня есть таблица A_B с внешними ключами, которая сопоставляет отношения записи A-to-B. Стандартный материал.
Все, что я пытаюсь выяснить, – это как запросить таблицы перед тем, как я войду в новую запись (одна запись «A» с одной или несколькими «B» записями), если совпадающие, идентичные отношения уже существуют. Цель состоит в том, чтобы не дублировать данные.
Наконец, эти таблицы будут расти достаточно большими, поэтому мне нужно держать сверху вниз, где это вообще возможно.
ОБНОВИТЬ
Ниже приведен пример запроса, который я пытался определить, если существует существующая запись A, сопоставленная значениям B_id 3, 4 и 5. Она работает, однако возвращает ложные срабатывания, если есть два разных значения A_id, которые занимают 3, 4, и 5, например:
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.
Спасибо участникам, которые вскочили и, в конечном счете, направили меня в правильном направлении.
ура