【问题标题】:mySQL multiple select from two tables (filtering)mySQL 从两个表中多选(过滤)
【发布时间】:2014-12-22 14:47:19
【问题描述】:

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

请帮忙

提前致谢

【问题讨论】:

    标签: php mysql filter


    【解决方案1】:

    如果您想选择所有产品,则没有理由同时包含过滤器。一种方法是使用聚合和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 的所有内容。

    【讨论】:

      【解决方案2】:

      试试这个:

      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)
      

      【讨论】:

        【解决方案3】:

        您可以使用 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)
        

        【讨论】:

          【解决方案4】:

          你应该在这两个条件之间或:

          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)
          

          【讨论】:

            【解决方案5】:

            考虑你的逻辑:

             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 仅返回具有 4 或 6 的 filter_child 记录 - 这将捕获至少具有这两个值之一的记录。然后,COUNT(..) + GROUP + HAVING 业务将过滤掉除具有这两个值的记录之外的所有记录。

            【讨论】:

            • 我仍然需要产品同时具有 4 和 6 如果我使用 OR 我得到错误的结果我需要具有 4 和 6 的产品...
            猜你喜欢
            • 2017-11-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多