Я даю действительно сокращенный пример структуры таблиц и реальный пример. Допустим, у меня есть: Язык - PHP, DB - MySQL
- 1) Таблица - Атрибуты_типы (идентификатор, имя)
- 2) Таблица - Атрибуты (id, attribute_type_id, name)
- 3) Таблица - Атрибуты_dependencies (attribute_id, противоположный_attribute_id)
Идея таблицы 3 состоит в том, чтобы исключить комбинацию между 2 атрибутами из разных типов атрибутов.
Пример:
Attribute_types
id | name
1 Size
2 Color
3 Material
Attributes
id | attribute_type_id | name
1 1 S
2 1 M
3 1 L
4 2 Blue
5 2 Red
6 3 Leather
7 3 Silk
Attributes_dependencies
attribute_id | opposite_attribute_id
1 6
7 1
Приведенный выше пример показывает, что у нас есть зависимость и комбинация между (перечисленные ниже не должны существовать)
Мне нужно есть комбинации, подобные этой (2 * 2 * 2 = 8), помните, что мы исключаем одну из атрибута type_type 1 ( S ):
2-4-6
2-5-6
2-4-7
2-5-7
3-4-6
3-5-6
3-4-7
3-5-7
Я должен получить их как коллекцию (объект / массив) сгруппирован по attribute_type_id без зависимостей (исключая S )
Пример:
Array
(
[1] => Array
(
[0] => 2
[1] => 3
)
[2] => Array
(
[0] => 4
[1] => 5
)
[3] => Array
(
[0] => 6
[1] => 7
)
)
Мой вопрос, как это сделать Лучше всего применять непосредственно в запросе, даже если перед подготовкой есть несколько шагов, например, я собираю все идентификаторы в массиве и использую их в качестве оператора Where_in или других подзапросов.
Потому что, если я делаю это в foreach l oop он делает много запросов, чтобы проверить, является ли указанная комбинация c действительной или нет.
Помните, я привожу 1% моего реального примера, потому что в действительности я присоединяюсь еще к 6 таблицам и не имею комбинаций тысяч только 8