我正在尝试选择与客户偏好(即他们喜欢的颜色)匹配的产品,但是当子查询中评估的值是一个数组时,我在创建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'];
}
由于产生了相同的结果,我假设这不是问题所在,或者在查询中使用它之前需要分解它--我不太确定该怎么做。
发布于 2012-12-29 00:28:39
使用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)
发布于 2013-02-19 04:03:54
尽可能使用直接连接而不是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
发布于 2012-12-29 00:29:08
这听起来像是你试图向客户展示一份客户已经声明的颜色的产品列表(colors_love)。
这是伪代码,但是这个结构可能会得到你想要的东西,而不用担心会爆炸你的数组:
select
customers.cust_id, customers.fav_color, products.id, products.name
from
customers
inner join products
on customers.fav_color = products.color
https://stackoverflow.com/questions/14077214
复制相似问题