我正在使用PHP和MySQL进行分面导航。我遇到了一个问题,我想用特定的过滤器获得产品。
此处的示例结构和数据:http://sqlfiddle.com/#!9/80065/4
使用来自sqlfiddle的查询我会得到一个过滤器的结果就好了。
对于2个过滤器"查询"那"会"工作将是这样的:
SELECT * FROM `attributes` WHERE ( `attribute_id` = '49' AND `text` = 'LED' ) AND ( `attribute_id` = '358' AND `text` = '1920x1080 (FullHD)' )
当然这不起作用。
最终查询需要向我提供产品ID。从示例中可以看出:37743 37697
表格中有大约200,000行。
我不认为JOIN会成为一种解决方案,因为它需要花费很多时间才能在网站分面导航中使用。
匹配一行不是问题但是当我尝试匹配同一个表中的两行时,我无法使其工作。
过滤器需要可以使用超过2个WHERE,搜索2个属性只是一个例子,我需要更多。
返回的行需要包含与我的过滤器匹配的product_id,用于2个或更多属性。
感谢您的帮助!
答案 0 :(得分:0)
假设过滤器属性的数组如下:
$attributes[] = array(
49 => 'LED',
358 => '1920x1080 (FullHD)' );
然后,制作过滤器:
$filterPieces = array();
foreach ( $attributes as $attId => $text ) {
$filterPieces[] = sprintf(
"(`attribute_id` = '%d' AND `text` = '%s')",
$attId, $text );
}
$filter = implode( ' OR ', $filterPieces );
最后查询
$query = "SELECT * FROM `attributes` WHERE ( $filter )";
这是一个没有JOIN的解决方案,在前端。
在代码中,我为OR逻辑连接器设置implode( ' OR ', $filterPieces )
,因为AND产生矛盾,结果集为空,永远。
`attribute_id` = '49' AND `attribute_id` = '358'
没有行可以同时满足两个值的条件。
答案 1 :(得分:0)
我找到了一种方法来解决这个问题。
SELECT `product_id` FROM `attributes`
WHERE ( (`attribute_id` = '49' AND `text` = 'LED')
OR
(`attribute_id` = '358' AND `text` = '1920x1080 (FullHD)') )
GROUP BY `product_id`
HAVING count(*) = 2
这将返回与我的两个过滤器匹配的产品ID。
工作方式:http://sqlfiddle.com/#!9/80065/35
感谢所有的评论和答案!