Обновление: Поработав с этим в течение нескольких часов, выбрал решение для нескольких запросов и использовал таблицу, которая содержала только родительские атрибуты, чтобы определить, какие элементы необходимо обновить.
Извините за плохое название, я не мог придумать, как кратко описать эту проблему.
У меня есть набор предметов, которые должны иметь отношение 1-к-1 с атрибутом.
У меня есть запрос, чтобы вернуть те строки, где данные неверны, и это отношение было нарушено (1-ко-многим). Я собираю эти строки, чтобы исправить их и восстановить отношения 1: 1.
Это теоретическое упрощение моей реальной проблемы, но я опубликую пример схемы таблицы здесь, как это было запрошено.
item
таблица:
+------------+------------+-----------+
| item_id | name | attr_id |
+------------+------------+-----------+
| 1 | BMW 320d | 20 |
| 1 | BMW 320d | 21 |
| 2 | BMW 335i | 23 |
| 2 | BMW 335i | 34 |
+------------+------------+-----------+
attribute
таблица:
+---------+-----------------+------------+
| attr_id | value | parent_id |
+---------+-----------------+------------+
| 20 | SE | 21 |
| 21 | M Sport | 0 |
| 23 | AC | 24 |
| 24 | Climate control | 0 |
....
| 34 | Leather seats | 0 |
+---------+-----------------+------------+
Простой запрос для возврата элементов с более чем одним атрибутом.
SELECT item_id, COUNT(DISTINCT(attr_id)) AS attributes
FROM item GROUP BY item_id HAVING attributes > 1
Это дает мне набор результатов примерно так:
+-----------+------------+
| item_id | attributes |
+-----------+------------+
| 1 | 2 |
| 2 | 2 |
| 3 | 2 |
-- etc. --
Однако есть исключение. Таблица attribute
может содержать древовидную структуру через родительские ссылки в таблице. Для определенных строк parent_id
может содержать идентификатор другого атрибута. У этого дерева только один уровень. Пример:
+---------+-----------------+------------+
| attr_id | value | parent_id |
+---------+-----------------+------------+
| 20 | SE | 21 |
| 21 | M Sport | 0 |
....
Я не хочу получить элементы в моем исходном запросе, где для пары связанных атрибутов они связаны как атрибуты 20 и 21.
Я делаю хочу получить элементы, где:
- атрибуты не имеют родителя
- для двух или более атрибутов, которые они не связаны (например, атрибуты 23 и 34)
Пример желаемого результата, просто ID товара:
+------------+
| item_id |
+------------+
| 2 |
+------------+
Как я могу присоединиться к attributes
из items
и исключить эти строки?
Использую ли я временную таблицу или могу ли я добиться этого одним запросом?
Спасибо.