Sql 在子查询中使用IN语句,当所断言的子查询值是数组时

Sql 在子查询中使用IN语句,当所断言的子查询值是数组时,sql,arrays,select,subquery,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

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

由于这产生了相同的结果,我假设这不是问题所在,或者在查询中使用它之前需要对其进行分解-我不太确定如何执行此操作。

DoIt with存在如下情况:

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)

请按如下方式使用现有设备执行此操作:

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)

听起来你是想给客户展示一份产品清单,上面的颜色是客户已经表示他/她喜欢的颜色(你喜欢的颜色)

这是伪代码,但此结构可能会得到您想要的,而无需担心阵列爆炸:

select 
    customers.cust_id, customers.fav_color, products.id, products.name
from
    customers
        inner join products
            on customers.fav_color = products.color

听起来你是想给客户展示一份产品清单,上面的颜色是客户已经表示他/她喜欢的颜色(你喜欢的颜色)

这是伪代码,但此结构可能会得到您想要的,而无需担心阵列爆炸:

select 
    customers.cust_id, customers.fav_color, products.id, products.name
from
    customers
        inner join products
            on customers.fav_color = products.color

在可能的情况下,使用直接连接总是比使用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

在可能的情况下,使用直接连接总是比使用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


这个问题通常通过规范化数据库结构来解决。如果有product_颜色和user_颜色的表,则查询将是这两个表的联接(仅限于user_id)以获取product的PK,然后是products的联接以获取实际的产品。但是,这并不能回答你的问题。我认为我不能在这里采用这种方法。为了简化这个问题,我只包含了几个字段,但每个客户都有几百个字段,其中大约一半是数组。类似的问题已经存在,一般的共识似乎是运行一个存储过程,将分解后的值存储到一个表中,以便执行联接。不管你怎么说,它都不会执行得很快。()这是你一次为一个用户做的事情,还是你需要同时为所有用户做的事情?当你说“数组”时,你是在说逗号分隔的列表吗?@Fls'Zen products.color只是一种颜色(我在尝试最简单的示例1rst;-),但是其他一些产品字段是逗号分隔的列表。通常通过规范化数据库结构来解决此问题。如果有product_颜色和user_颜色的表,则查询将是这两个表的联接(仅限于user_id)以获取product的PK,然后是products的联接以获取实际的产品。但是,这并不能回答你的问题。我认为我不能在这里采用这种方法。为了简化这个问题,我只包含了几个字段,但每个客户都有几百个字段,其中大约一半是数组。类似的问题已经存在,一般的共识似乎是运行一个存储过程,将分解后的值存储到一个表中,以便执行联接。不管你怎么说,它都不会执行得很快。()这是你一次为一个用户做的事情,还是你需要同时为所有用户做的事情?当你说“数组”时,你是在说逗号分隔的列表吗?@Fls'Zen products.color只是一种颜色(我在尝试最简单的示例1rst;-),但是其他一些产品字段是逗号分隔的列表,我不知道是否存在,所以感谢您与我分享:-)我认为语法可能有点不正确,因为它没有显示任何结果(我的测试代码中有3项匹配),因此,我将尝试了解有关使用EXISTS的更多信息,以便有希望使用它。尝试然后替换:WHERE FIND_IN_SET(products.color,style.colors_lov)>0我在您的回答中尝试了更新的代码,但这会给我错误消息“调用本机函数“FIND_IN_SET”时参数计数不正确”:-(Chaya,这是一个拼写错误,逗号代替了=重试:)是的,只需向WHERE筛选器添加更多条件。我不知道存在,因此感谢与我分享:-)我认为语法可能有点不正确,因为它没有显示任何结果(我的测试代码中有3项匹配),因此,我将尝试了解有关使用EXISTS的更多信息,以便有希望使用它。尝试然后替换:WHERE FIND_IN_SET(products.color,style.colors_lov)>0我在您的回答中尝试了更新的代码,但这会给我错误消息“调用本机函数“FIND_IN_SET”时参数计数不正确”:-(Chaya,这是一个拼写错误,逗号代替了=再试一次:)是的,只需在WHERE filter.fav_color是一个值列表中添加更多条件,它就不起作用了。(例如:products.color='red'和customers.fav_color='red,blue,orange')因为颜色是从数据库中获取的,我假设创建数组是(不必要的)在PHP中完成。OP没有数据样本。我做了一个假设——不需要向下投票。这是SO的唯一问题:向下投票经常被错误地解释。这只是为了突出一个事实,即答案不相关,根本不是针对个人的。2个选项:删除你自己的答案(取消负号)或者修改内容?很公平——我很感谢你的解释。我真的很感谢这次对话:-)这两个方面都是解释什么东西不起作用