Mysql
 sql >> база данни >  >> RDS >> Mysql

Брой атрибути за фасетирано търсене

Ето как можете да направите това:

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 демонстрация



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите няколко колони от една колона, SQL

  2. mysql:SOURCE грешка 2?

  3. EntityFramework 6.1.3 и MySQL DbFunctions.TruncateTime не съществува?

  4. PDO::__construct():Сървърът изпрати набор от знаци (255), неизвестен на клиента. Моля, докладвайте на разработчиците

  5. System.Data.SqlClient пространство от имена за MySQL?