Đây là cách bạn có thể làm điều này:
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
Đầu ra:
| META_NAME | META_VALUE | COUNT | |----------------|------------|-------| | Car Type | Coupe | 2 | | Car Type | Sedan | 1 | | Color | Black | 1 | | Color | Red | 1 | | Color | White | 1 | | Interior Color | Black | 2 | | Interior Color | Grey | 1 | | Make | BMW | 2 | | Make | Honda | 1 | | Model | 2Series | 1 | | Model | 3Series | 1 | | Model | Civic | 1 |
Đây là SQLFiddle bản demo
CẬP NHẬT:
Đã lọc:
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;
Đầu ra:
| META_NAME | META_VALUE | COUNT | |----------------|------------|-------| | Car Type | Coupe | 2 | | Color | Black | 1 | | Color | White | 1 | | Interior Color | Black | 1 | | Interior Color | Grey | 1 | | Make | BMW | 2 | | Model | 2Series | 1 | | Model | 3Series | 1 |
Đây là SQLFiddle bản demo
CẬP NHẬT2:
Nó rất dễ dàng. Đương nhiên thay vì sử dụng AND
trong HAVING
mệnh đề (ô tô không thể có màu đen và đỏ cùng một lúc) bạn phải sử dụng OR
như vậy
HAVING MAX(meta_name = 'Color' AND meta_value = 'Black') = 1
OR MAX(meta_name = 'Color' AND meta_value = 'Red') = 1
hoặc đây là một cách khác để thể hiện cùng một mục đích
HAVING MAX(meta_name = 'Color' AND meta_value = 'Black') +
MAX(meta_name = 'Color' AND meta_value = 'Red') > 0
Đây là SQLFiddle bản demo