我的数据库中有两个表,我想要进行选择查询 第一个保留产品id(int)以及产品是否已发布 第二个表保留过滤器,并与id_product(基本上是Products的product_id)匹配。在id_filter_child,我们有值
产品
product_id,
published
过滤器
id_pro_fil,
id_product,
id_filter_child
我的桌子现在是:
产品
1 yes
2 yes
3 no
过滤器
10 1 4
11 1 5
12 2 4
13 2 6
14 2 7
这就是我目前的数据库。 从输入我有我想要搜索的过滤器 所以我想选择filter = 4的所有产品 我用:
SELECT * FROM products,filters
WHERE products.product_id=filters.id_product
AND products.published='1'
AND filters.id_filter_child='4'
那个有效!
现在我需要选择所有带过滤器4和6的产品。 我用:
SELECT * FROM products,filters
WHERE products.product_id=filters.id_product
AND products.published='1'
AND filters.id_filter_child='4'
AND filters.id_filter_child='6'
但我不工作 (因此我希望产品的id = 2)
请帮忙
提前致谢
答案 0 :(得分:0)
试试这个:
SELECT p.*
FROM products p
LEFT JOIN filters ON p.product_id = f.id_product
WHERE p.published='1' AND f.id_pro_fil IN (4,6)
答案 1 :(得分:0)
考虑你的逻辑:
AND filters.id_filter_child='4'
AND filters.id_filter_child='6'
您要求数据库中的每个filter_child
同时拥有两个 DIFFERENT 值。 “这个记录必须是同一个香蕉和法拉利”
您需要OR
代替:
AND ((filter_child = '4') OR (filter_child = '6'))
(注意额外的括号),或更紧凑:
AND (filter_child IN ('4', '6'))
---评论后续
如果您需要将两个值附加到记录中,那么您将不得不使用一些额外的逻辑:
SELECT *, COUNT(filters.id_filter_child IN ('4', '6')) AS count
FROM products,filters
WHERE products.product_id=filters.id_product
AND products.published='1'
AND filters.id_filter_child IN ('4', '6')
GROUP BY filters.id_filter_child
HAVING count = 2
where
仅返回对于filter_child具有4
或6
的记录 - 这将捕获具有这两个值中的至少一个的记录。然后,COUNT(..)
+ GROUP
+ HAVING
业务将过滤除了那些具有两个值的记录。
答案 2 :(得分:0)
您可以使用OR或IN
SELECT * FROM products,filters
WHERE products.product_id=filters.id_product
AND products.published='1'
AND (filters.id_filter_child='4' OR filters.id_filter_child='6')
SELECT * FROM products,filters
WHERE products.product_id=filters.id_product
AND products.published='1'
AND filters.id_filter_child IN (4,6)
答案 3 :(得分:0)
你应该在两个条件之间 OR :
SELECT * FROM products,filters
WHERE products.product_id=filters.id_product
AND products.published='1'
AND filters.id_filter_child='4'
OR filters.id_filter_child='6'
但为了使您的sql更小更简单,您也可以使用 IN 运算符:
SELECT * FROM products,filters
WHERE products.product_id=filters.id_product
AND products.published='1'
AND filters.id_filter_child IN(4,6)
答案 4 :(得分:0)
如果您想选择所有产品,则没有理由同时包含过滤器。一种方法是使用聚合和having
子句:
SELECT p.*
FROM products p JOIN
filters f
ON p.product_id = f.id_product
WHERE p.published = '1'
GROUP BY p.product_id
HAVING SUM(f.id_filter_child = '4') > 0 AND
SUM(r.id_filter_child = '6') > 0
这会返回同时包含过滤器4和过滤器6的产品。
请注意,我还修复了查询以使用正确的join
语法。
我喜欢这种方法用于" set-within-sets"子查询,因为它很通用。您可以使用类似条件向HAVING
子句添加另一个过滤器。通过将第二个> 0
更改为= 0
,您可以获得4但不是6的所有内容。