Поскольку я начинающий пользователь 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 ║
╚═════════╩════════╩═════════╝
Так что позже я смогу использовать ее для выборочного поиска по этим значениям, чтобы увидеть, какие типы под каким брендом.