2015-12-27 23 views
2

我有以下SQL查询,在这种情况下,以搜索产品:MySQL的FIND_IN_SET对于在集合中的所有搜索字符串结果

SELECT  sql_cache distinct p.products_id 
FROM  products p 
INNER JOIN filter_association_products fap 
ON   p.products_id =fap.products_id 
WHERE  p.products_status = '1' 
AND  date_sub(curdate(),interval 3000 day) <= p.products_date_added 
AND  find_in_set(fap.filter_id,'130,128') 
ORDER BY p.products_date_added DESC 

目前的结果我得到的是所有具有FAP产品.filter_id 128和fap.filter_id 130,但我希望它仅列出具有这些过滤器的这两个的产品。

基本上我想用FIND_IN_SET做到这一点:

AND (fap.filter_id = '130' AND fap.filter_id = '128') 

现在它的功能方法是:

AND (fap.filter_id = '130' OR fap.filter_id = '128') 

如何才能实现这一目标?

+0

你是什么意思@Strawberry? – CreativeMind

+0

认为我误解了 - 但下面的答案似乎已涵盖 – Strawberry

+0

没有真正涵盖。我仍然得到与AND相同的结果(fap.filter_id ='130'或fap.filter_id ='128')'而不是'AND(fap.filter_id ='130'和fap.filter_id ='128')' – CreativeMind

回答

1

为了解决这个问题,你需要告诉sql引擎每种类型需要多少匹配结果。一般你不指定逗号分隔的元素,而是使用find_in_set在未知的元素列表中查找特定的事物。您可以轻松将其更改为IN()声明。

WHERE p.produccts_status = 1 
AND .... 
AND fap.filder_id IN(130, 128) 

它一个更好的标准来写与做什么,他们有尽而意提供的功能/方法的代码。这是说,你可以保持它,如果你想。

你需要添加一个GROUP BY p.products_id,包括一个HAVING子句来算我这里放2纪录

HAVING count(p.products_id) = 2 

数量,因为你只是在寻找2项必须匹配 你可以很容易地改变这无论你在寻找多少。因为它的东西,你是专门找你应该可以指定你要多少匹配的行嘛(因为你是在IN语句中指定它们)

SELECT  sql_cache distinct p.products_id 
FROM  products p 
INNER JOIN filter_association_products fap 
ON   p.products_id =fap.products_id 
WHERE  p.products_status = '1' 
AND  date_sub(curdate(),interval 3000 day) <= p.products_date_added 
AND  fap.filter_id IN (130, 128) 
GROUP BY p.products_id 
HAVING  COUNT(*) = 2 
ORDER BY p.products_date_added DESC 
+0

谢谢John''AND fap.filder_id IN(130,128)'给了我和'AND find_in_set(fap.filter_id,'130,128')'一样的结果,但是那不是我的问题。我想找到所有的产品ID都有filter_id 130和128 – CreativeMind

+0

我也编辑了我的问题来澄清 – CreativeMind

+0

顺便说一句,拼错'filder_id',应该是'filter_id'和'produccts_status'应该是'products_status' – CreativeMind

1

,其实你需要的是这样的:

AND fap.filter_id IN ('130', '128') 
GROUP BY p.products_id 
HAVING COUNT(*) = 2 

该方法是让所有具有两个数字的产品,而不仅仅是完全匹配。实际上它可能更多。

但是,如果不可能有两次相同的filter_id和​​,这是有效的。所以他们应该是唯一的。 如果没有看到here