Вы можете создать свой запрос с отдельными объединениями для каждой категории терминов и с отдельными условиями фильтрации для каждого из них.
SELECT cars.*, colorTerms.*, brandTerms.*
FROM cars
INNER JOIN term_car_relationships AS carColorTerms
ON cars.id = carColorTerms.car_id
INNER JOIN term_list AS colorTerms
ON carColorTerms.term_id = colorTerms.term_id AND colorTerms.taxonomy_id = 1
INNER JOIN term_car_relationships AS carBrandTerms
ON cars.id = carBrandTerms.car_id
INNER JOIN term_list AS brandTerms
ON carBrandTerms.term_id = brandTerms.term_id AND brandTerms.taxonomy_id = 2
WHERE colorTerms.term_id IN (6, 2)
AND brandTerms.term_id IN (3)
Конечно, для создания этого запроса вам необходимо знать термины 'типы перед запросом.
Кроме того, использование GROUP BY cars.id
без агрегирования, вероятно, является признаком проблемы или просто не правильным способом получить то, что вы хотите. Если вам нужна только информация из таблицы cars
, вам нужно просто SELECT DISTINCT cars.*
. Использование GROUP BY
таким образом приведет к результатам с данными только одного совпадения по цветовой марке для каждого автомобиля.
При сложном редактировании исходного вопроса появилась еще одна возможность....
SELECT cars.* -- You should really just select the fields you want, and may have to in some configurations (see GROUP BY)
FROM cars AS c
INNER JOIN term_car_relationships AS tcr ON c.car_id = tcr.car_id
INNER JOIN term_list AS tl ON tcr.term_id = tl.term_id
WHERE tcr.term_id IN (6, 2, 3)
GROUP BY cars.car_id -- In some configurations of MySQL, and most other RDBMSes, you must specify every SELECTed non-aggregated field here
HAVING COUNT(DISTINCT tl.taxonomy_id)
= ( SELECT COUNT(DISTINCT taxonomy_id)
FROM term_list
WHERE term_id IN (6, 2, 3)
)
Примечание. Это окончательное решение на самом деле не требует, чтобы вы больше знали термины таксономии раньше, и не растет, поскольку необходимо поддерживать больше таксономий;так что, хотя это немного менее очевидно с тем, что он делает, вероятно, определенно стоит подумать.