2

我正在尝试选择符合客户偏好的产品(即他们喜欢的颜色),但是当子查询中评估的值是数组时,我无法创建 IN 语句。

为了简化问题,我只包括了几个字段,但是每个客户都有几百个字段,其中大约一半是数组,并且有 apx. 每个产品的字段数量相同。

如果选择了一种以上的颜色,则此查询不起作用:

$result = mysql_query("SELECT * FROM products WHERE color IN 
(SELECT colors_love FROM style WHERE style.user_id=$user_id)")

我也尝试像这样爆炸数组:

while ($row = mysql_fetch_array($result)) {
$colors_love = explode(',', $row['colors_love']);
echo $row['product_name']. ", ". $row['style']. ",". $row['color']. ", ". $row['price'];
}

由于这产生了相同的结果,我假设这不是问题,或者在查询中使用它之前需要对其进行分解——我不太确定该怎么做。

4

3 回答 3

0

使用 EXISTS 执行以下操作:

SELECT * FROM products WHERE EXISTS
(SELECT 1 FROM style 
WHERE FIND_IN_SET(products.color,style.colors_love)>0 and style.user_id=$user_id)
于 2012-12-29T00:28:38.510 回答
0

在可能的情况下,使用直接连接而不是 IN 或 EXISTS 或 FIND_IN_SET 之类的函数总是更好的性能和实践。以下查询无需使用 IN 或 EXISTS 或其他函数即可实现您的目标:

SELECT
    products.*
FROM
    products
INNER JOIN
    (SELECT style.colors_love
    FROM style
    WHERE style.user_id = $user_id) AS fave_colors ON 
        fave_colors.colors_love = products.color
于 2013-02-19T04:03:53.617 回答
-1

听起来您正试图向客户展示客户已经声明她/他喜欢的颜色的产品列表 (colors_love)。

这是伪代码,但是这个结构可能会得到你想要的,而不用担心你的数组会爆炸:

select 
    customers.cust_id, customers.fav_color, products.id, products.name
from
    customers
        inner join products
            on customers.fav_color = products.color
于 2012-12-29T00:29:08.113 回答