Mysql | Фасетный поиск

У меня есть скрипка http://sqlfiddle.com/#!2/46a7b5/18

Этот запрос возвращает все атрибуты.

|      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 |

Чтобы получить результат поиска у меня есть запрос ниже:

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 | 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 |

Я ищу способ получить результаты, показанные ниже:

|      META_NAME | META_VALUE | COUNT |
|----------------|------------|-------|
|       Car Type |      Coupe |     2 |
|       Car Type |      Sedan |     0 |
|          Color |      Black |     1 |
|          Color |        Red |     0 |
|          Color |      White |     1 |
| Interior Color |      Black |     2 |
| Interior Color |       Grey |     1 |
|           Make |        BMW |     2 |
|           Make |      Honda |     0 |
|          Model |    2Series |     1 |
|          Model |    3Series |     1 |
|          Model |      Civic |     0 |

Является ли это возможным? Спасибо!

1

Решение

Вместо использования подзапроса вы можете получить значения из левого соединения и сосчитать различные ненулевые значения.

SELECT meta_name, meta_value, COUNT(DISTINCT pid) count
FROM meta m JOIN item_meta im
ON im.field_id = m.id
LEFT JOIN (
SELECT i.id pid
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)
LJ ON im.item_id = LJ.pid
GROUP BY meta_name, meta_value;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]