使用php进行分面搜索

时间:2014-06-10 19:36:20

标签: php mysql faceted-search

有没有办法在没有solr,lucene等的情况下进行分面搜索。只有php,MySQL和Javascript。我试图在分类广告网站上实施,但失败了。问题是当尝试过滤属性表时。结构如下:

表项目:

id    description user_id
1     my car       3
2     dream car    3
3     New car      3
4     Old car      4

表元字段:

id     meta name   
 1     Make
 2     Model
 3     Color
 4     Car Type
 5     Interior Color

表项目Meta:

item_id    field_id     meta_value
 1           1          BMW
 1           2          3Series
 1           3          White
 1           4          Coupe
 1           5          Black
 2           1          BMW
 2           2          2Series
 2           3          Black
 2           4          Coupe
 2           5          Grey
 3           1          Honda
 3           2          Civic
 3           3          Red
 3           4          Sedan
 3           5          Black

现在我想过滤一下如果有人选择Black BMW,但如果我使用IN给它全黑或宝马。但我想和AND条件相同。 如果您知道分面搜索,那么您可以很容易地知道我的意思。我想使用上面的表结构进行查询。

**Addition:**

此外,我需要显示搜索和列出的每个属性的计数。像:

Make:
BMW (2)
Color:
Black(2)
White(1)
...
Car Type:
....
Interior Color:
...

1 个答案:

答案 0 :(得分:2)

你在找这样的东西吗?

SELECT i.*, 
       MAX(CASE WHEN meta_name = 'Make' THEN meta_value END) make,
       MAX(CASE WHEN meta_name = 'Color' THEN meta_value END) color
  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 = 'Color' AND meta_value = 'Black') = 1

输出:

| ID | DESCRIPTION | USER_ID | MAKE | COLOR |
|----|-------------|---------|------|-------|
|  2 |   dream car |       3 |  BMW | Black |

这是 SQLFiddle 演示