在子查询中使用IN语句时,在数组中评估子查询值

时间:2012-12-28 23:49:01

标签: sql arrays select subquery

我正在尝试选择符合客户偏好的产品(即他们喜欢的颜色),但是当子查询中评估的值是数组时,我无法创建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'];
}

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分:-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