分面搜索属性计数

时间:2014-06-11 09:14:39

标签: php mysql faceted-search

我想要跟随小提琴进行属性计数查询。 FIDDLE

它的工作完美,但我没有使用它计算属性。不知道它是如何实现的,因为花了很多时间和更改查询仍然不适合我。 有人有建议??

2 个答案:

答案 0 :(得分:1)

您可以这样做:

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

这是 SQLFiddle 演示

<强>更新

过滤

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 |

这是 SQLFiddle 演示

UPDATE2:

  

另外如何处理相同功能2次,就像我一样   搜索黑色和红色没有别的。它目前没有显示任何结果。   但它应该显示两个结果。但如果查询就像宝马黑色和   红色然后它应该只显示宝马黑色或红色,否则显示0   结果

很容易。自然而不是在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

这是 SQLFiddle 演示

答案 1 :(得分:0)

我不太确定您想要计算什么,但此查询会计算数据库中的每个条目:http://sqlfiddle.com/#!2/46a7b5/15/0

只需使用COUNT()函数:http://dev.mysql.com/doc/refman/5.1/en/counting-rows.html