1

我正在开发的搜索功能有一点小问题,需要您的帮助。

总而言之,有一个向用户显示的产品列表;通过点击不同的标准,用户可以缩小这个列表的大小并找到合适的产品。

搜索条件示例:

在此处输入图像描述

例如,它将获取类别 222 中的所有产品。然后如果用户单击颜色“D”,它将仅显示颜色为“D”的产品。如果用户添加颜色“E”,它将显示具有任一颜色的产品。

非常重要的是,如果用户点击颜色“D”、颜色“E”,然后点击净度“FL”和净度“IF”;它必须显示带有 的产品((color = D OR color = E) AND (clarity = FL OR clarity = IF))

但是,数据库的结构并非如此,所有不同的选项(颜色 D、颜色 E、颜色 E、净度 FL、净度 IF...)都位于名为 id_feature_value 的同一列下:

在此处输入图像描述

到目前为止,这是我的 sql 请求(为便于阅读而简化):

$sql = 'SELECT p.*
                FROM `'._DB_PREFIX_.'product` p
                LEFT JOIN `'._DB_PREFIX_.'category_product` c ON (c.`id_product` = p.`id_product`)
                LEFT JOIN `'._DB_PREFIX_.'feature_product` f ON (f.`id_product` = p.`id_product`)
                WHERE c.`id_category` = 222 '.$searchValues.
                ' GROUP BY f.`id_product` ORDER BY p.`id_product` DESC LIMIT '.$scroll.',20';

$searchValues变量对应于上面解释的内容,并且 - 不幸且显然 - 不起作用。

$scroll变量对应于用户的滚动级别。此函数收集前 20 个条目,当用户到达底部时,将带来 20 个下一个条目。

我已经查看了这种可能性,但是由于and的组合IN,我无法使其工作。ANDOR

你能帮我解决这个问题吗?

如果您需要更多信息,请告诉我。

非常感谢!

4

1 回答 1

0

你可以把你的条件放在HAVING COUNT. 例如,假设id_feature = 20代表颜色,值1142,1143代表不同的颜色。然后下面的查询将计算每个产品有多少这两种颜色,并只返回那些有 1 或更多的颜色。您可以AND COUNT(CASE ...根据需要添加任意数量的条件。

GROUP BY f.`id_product`
HAVING
    COUNT(CASE 
        WHEN id_feature = 20 
            AND id_feature_value IN (1142,1143)
        THEN 1
        END) > 0

    AND COUNT(CASE 
        WHEN id_feature = 23 
            AND id_feature_value IN (233,234)
        THEN 1
        END) > 0

编辑

另一种可能更快的方法是使用EXISTSie

SELECT p.* FROM product p
WHERE EXISTS (
    SELECT 1 FROM feature_product
    WHERE id_feature = 20
    AND id_feature_value IN (1142,1143)
    AND id_product = p.id
) AND EXISTS (
    SELECT 1 FROM feature_product
    WHERE id_feature = 23
    AND id_feature_value IN (233,234)
    AND id_product = p.id
)
于 2014-07-21T08:19:17.660 回答