php - 数据库 |分面搜索

标签 php mysql sql facet having

我有一把 fiddle :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;

And new fiddle.

我的输出:

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

这可能吗?谢谢!

最佳答案

您可以不使用子查询,而是从左连接获取值并计算不同的非空值。

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;

关于php - 数据库 |分面搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25843881/

相关文章:

php - 使用 PHP 访问 FTP 目录列表

mysql - 通过读取2个表中的多个字段来更新一个字段

sql - 如何转换为字符串内部查询的结果?

php - 为什么使用 WHERE 语句时无法 echo mysql 查询结果

php - 用于覆盖表前缀的 Joomla 插件

php - 如何更新在 Ubuntu 上不工作的 zend-framework

php - 价格或货币变为 0.00

mysql - Symfony MySQL 子查询最佳实践 : Native, QueryBuilder 或 DQL

SQL 记录出现次数

php - Varchar 类型的 MySql 复合唯一索引