Как исключить комбинацию идентификаторов зависимостей (в запросе или после этого в l oop foreach)? - PullRequest
1 голос
/ 07 апреля 2020

Я даю действительно сокращенный пример структуры таблиц и реальный пример. Допустим, у меня есть: Язык - 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

Приведенный выше пример показывает, что у нас есть зависимость и комбинация между (перечисленные ниже не должны существовать)

  • S с Кожа
  • Шелк с S

Мне нужно есть комбинации, подобные этой (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

...