Ето как можете да направите това:
SELECT meta_name, meta_value, COUNT(DISTINCT item_id) count
FROM meta m JOIN item_meta im
ON im.field_id = m.id
GROUP BY meta_name, meta_value
Изход:
<пред>| META_NAME | META_VALUE | БРОЙ ||----------------|------------|-------|| Тип кола | Купе | 2 || Тип кола | Седан | 1 || Цвят | Черно | 1 || Цвят | Червено | 1 || Цвят | Бяло | 1 || Цвят на интериора | Черно | 2 || Цвят на интериора | Сив | 1 || Направете | BMW | 2 || Направете | Honda | 1 || Модел | 2Серия | 1 || Модел | 3Серия | 1 || Модел | Civic | 1 |Ето SQLPiddle демонстрация
АКТУАЛИЗИРАНЕ:
Филтрирано:
SELECT meta_name, meta_value, COUNT(DISTINCT item_id) count
FROM meta m JOIN item_meta im
ON im.field_id = m.id
WHERE item_id IN
(
SELECT i.id
FROM item_meta im JOIN items i
ON im.item_id = i.id JOIN meta m
ON im.field_id = m.id
GROUP BY i.id
HAVING MAX(meta_name = 'Make' AND meta_value = 'BMW') = 1
AND MAX(meta_name = 'Car Type' AND meta_value = 'Coupe') = 1
)
GROUP BY meta_name, meta_value;
Изход:
<пред>| META_NAME | META_VALUE | БРОЙ ||----------------|------------|-------|| Тип кола | Купе | 2 || Цвят | Черно | 1 || Цвят | Бяло | 1 || Цвят на интериора | Черно | 1 || Цвят на интериора | Сив | 1 || Направете | BMW | 2 || Модел | 2Серия | 1 || Модел | 3Серия | 1 |Ето SQLPiddle демонстрация
АКТУАЛИЗАЦИЯ 2:
Лесно е. Естествено, вместо да използвате AND
в HAVING
клауза (колата не може да бъде черна и червена едновременно) трябва да използвате OR
така
HAVING MAX(meta_name = 'Color' AND meta_value = 'Black') = 1
OR MAX(meta_name = 'Color' AND meta_value = 'Red') = 1
или ето друг начин да изразите същото намерение
HAVING MAX(meta_name = 'Color' AND meta_value = 'Black') +
MAX(meta_name = 'Color' AND meta_value = 'Red') > 0
Ето SQLPiddle демонстрация