MySQL查找集合中包含所有搜索字符串的结果
我使用以下SQL查询来搜索本例中的产品:MySQL查找集合中包含所有搜索字符串的结果,mysql,Mysql,我使用以下SQL查询来搜索本例中的产品: 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
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
现在它的工作方式是:
AND (fap.filter_id = '130' OR fap.filter_id = '128')
如何实现这一点?要解决这个问题,您需要告诉sql引擎每种类型需要多少匹配结果。通常不指定逗号分隔的元素,而是使用find_in_set在未知元素列表中查找特定的内容。您可以轻松地将其更改为
IN()
语句
WHERE p.produccts_status = 1
AND ....
AND fap.filder_id IN(130, 128)
使用提供的函数/方法编写代码是更好的标准,这些函数/方法可以实现它们的预期功能。也就是说,如果你愿意,你可以保持原样
您需要按p.products\u id添加一个组,并包括一个HAVING子句来计算记录数
HAVING count(p.products_id) = 2
我把2放在这里,因为您只需要寻找2个必须匹配的项目
你可以很容易地改变这是多少你正在寻找。由于它是您专门寻找的内容,因此您应该能够指定需要多少匹配行(因为您在in
语句中指定了它们)
选择sql\u缓存不同的p.products\u id
来自产品p
内部连接过滤器协会产品fap
在p.products\u id=fap.products\u id上
其中p.products\u status='1'
和date_sub(curdate(),间隔3000天)实际上,您需要这样的东西:
AND fap.filter_id IN ('130', '128')
GROUP BY p.products_id
HAVING COUNT(*) = 2
方法是让所有的产品都有这两个数字,而不仅仅是精确匹配。实际上可能不止2个
但是,如果不可能两次使用相同的filter\u id
和products\u id
,则这是有效的。所以它们应该是独一无二的。
如果没有看到。谢谢,John和fap.filder\u id IN(130,128)
给了我与和find\u IN\u set(fap.filter\u id,'130128')相同的精确结果,但这不是我的问题。我想找到所有同时具有filter\u id 130和128的产品id顺便说一句,你拼写错误了filder\u id
,应该是filter\u id
,而products\u status
应该是products\u status
@CreativeMind关于IN的第一部分只是一个建议。。我仍然用答案底部的HAVING从句部分回答了你的问题。。请通读一遍,我可能会误解你的答案。尝试添加group by时出现sql语法错误。你能用我的问题的完整修改来编辑你的问题吗?谢谢,伙计,救了我一天!:)你说“草莓”是什么意思?我想我误解了——但下面的答案似乎涵盖了它,而不是真正涵盖了它。我仍然得到与和(fap.filter\u id='130'或fap.filter\u id='128')
相同的结果,而不是和(fap.filter\u id='130'和fap.filter\u id='128')
我想你可能还没有理解给出的答案
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
AND fap.filter_id IN ('130', '128')
GROUP BY p.products_id
HAVING COUNT(*) = 2