mySQL多选两个表(过滤)

时间:2014-12-22 14:47:20

标签: php mysql filter

我的数据库中有两个表,我想要进行选择查询 第一个保留产品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)

请帮忙

提前致谢

5 个答案:

答案 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具有46的记录 - 这将捕获具有这两个值中的至少一个的记录。然后,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的所有内容。