匹配同一个表MySQL上的多个行

时间:2015-04-13 14:52:03

标签: mysql

我正在使用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个或更多属性。

感谢您的帮助!

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

感谢所有的评论和答案!