Построить таблицу отношений ManyToMany между значениями из одного столбца, сопоставленного с другим значением - PullRequest
0 голосов
/ 26 сентября 2019

Поскольку я начинающий пользователь MySQL / MariaDB, я понятия не имею, что вообще искать, чтобы выполнить эту работу, поэтому, если вы знаете, что ответ уже есть, отметьте его как дубликат этого.

Вопрос: Учитывая приведенные ниже 2 таблицы, как я могу правильно отфильтровать ее, чтобы я мог создать таблицу, которая содержит отношения между brandID, typeID и modelID, где можно иметь несколько из них в одной статье, или это невозможно?

Я должен также упомянуть, что я хочу либо выполнить это для события в PHP при изменении статьи, либо для команды, написанной на php как cronjob.

Я не могу напрямую редактировать эти таблицыкак они используются фреймворком, который я использую (Shopware).

таблица: s_filter_articles (где valueID отображается на s_filter_values.id)

╔═══════════╦═════════╗
║ articleID ║ valueID ║
╠═══════════╬═════════╣
║       273 ║      42 ║
║       274 ║      43 ║
║       273 ║      44 ║
║       273 ║      45 ║
║       274 ║      46 ║
║       274 ║      47 ║
╚═══════════╩═════════╝

таблица: s_filter_values Где:

  • optionID 8 = brandID
  • optionID 9 = modelID
  • optionID 10 = typeID

Эти идентификаторы функционируют как ГРУППЫ и позиционируются как числа в группе.

╔════╦══════════╦══════════╦══════════╦══════════╗
║ id ║ optionID ║  value   ║ position ║ media_id ║
╠════╬══════════╬══════════╬══════════╬══════════╣
║ 42 ║        8 ║ HP       ║        0 ║ NULL     ║
║ 43 ║        8 ║ Brother  ║        1 ║ NULL     ║
║ 44 ║       10 ║ Envy     ║        0 ║ NULL     ║
║ 45 ║        9 ║ 5032     ║        0 ║ NULL     ║
║ 46 ║       10 ║ DCP      ║        1 ║ NULL     ║
║ 47 ║        9 ║ DCP-110C ║        1 ║ NULL     ║
╚════╩══════════╩══════════╩══════════╩══════════╝

Я могу получитьэто чтобы показать:

╔═══════════╦═════════╦════════╦═════════╗
║ articleID ║ brandID ║ typeID ║ modelID ║
╠═══════════╬═════════╬════════╬═════════╣
║       273 ║      42 ║     44 ║      45 ║
║       274 ║      43 ║     46 ║      47 ║
╚═══════════╩═════════╩════════╩═════════╝

Делая это:

SELECT
    MAX(brandID) as brandID,
    MAX(typeID) as typeID,
    MAX(modelID) as modelID
        FROM
        (SELECT
            articleID,
            (SELECT id FROM s_filter_values WHERE id = valueID AND s_filter_values.optionID = 8) as brandID,
            (SELECT id FROM s_filter_values WHERE id = valueID AND s_filter_values.optionID = 10) as typeID,
            (SELECT id FROM s_filter_values WHERE id = valueID AND s_filter_values.optionID = 9) as modelID
            FROM s_filter_articles a
                INNER JOIN s_filter_values v
                    ON a.valueID = v.id WHERE optionID IN (8,9,10)) as SelectiveTable GROUP BY articleID;

Что, вероятно, запутано, но работает, если есть только одно отношение между brand -> type -> model -> article, но из-за возможностиИмея множественные отношения между статьей и типами / моделями / брендами, она должна выглядеть следующим образом:

╔═════════╦════════╦═════════╗
║ brandID ║ typeID ║ modelID ║
╠═════════╬════════╬═════════╣
║      42 ║     44 ║      45 ║
║      43 ║     46 ║      47 ║
║      42 ║     44 ║      45 ║
╚═════════╩════════╩═════════╝

Так что позже я смогу использовать ее для выборочного поиска по этим значениям, чтобы увидеть, какие типы под каким брендом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...