【问题标题】:Select items that has no specifc value选择没有特定价值的项目
【发布时间】:2011-02-02 03:53:03
【问题描述】:

我有产品表——每个表都有几个类别;每个类别都有一个主列。 (我还有一个类别表和一个 product_categories 表。)

如果main = 1 -> 它是主要类别

我想选择根本没有主要类别的所有产品(与该产品相关的所有类别都没有main = 1 列)。

这是选择所有主要类别的方法:

SELECT *
  FROM categories
 WHERE id IN (SELECT DISTINCT category_id
                FROM `product_categories`
               WHERE main = 1);

我如何找到没有主类别的产品?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    正如您提到的我想选择根本没有主要类别的所有产品(与该产品相关的所有类别都没有 main = 1 列)。 em>

    这就是你所追求的

    select * from products where prod_id not in (select distinct prod_id from categories where main =1);
    

    我试过了。

    mysql> desc products;
    +---------+--------------+------+-----+---------+-------+
    | Field   | Type         | Null | Key | Default | Extra |
    +---------+--------------+------+-----+---------+-------+
    | prod_id | int(11)      | YES  |     | NULL    |       |
    | name    | varchar(100) | YES  |     | NULL    |       |
    +---------+--------------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
    
    mysql> desc categories;
    +---------+---------+------+-----+---------+-------+
    | Field   | Type    | Null | Key | Default | Extra |
    +---------+---------+------+-----+---------+-------+
    | prod_id | int(11) | YES  |     | NULL    |       |
    | cat_id  | int(11) | YES  |     | NULL    |       |
    | main    | int(11) | YES  |     | NULL    |       |
    +---------+---------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    
    mysql> select * from products;
    +---------+-------+
    | prod_id | name  |
    +---------+-------+
    |       1 | prod1 |
    |       2 | prod2 |
    |       3 | prod3 |
    |       4 | prod4 |
    +---------+-------+
    4 rows in set (0.00 sec)
    
    mysql> select * from categories;
    +---------+--------+------+
    | prod_id | cat_id | main |
    +---------+--------+------+
    |       1 |      1 |    1 |
    |       1 |      2 |    2 |
    |       2 |      1 |    2 |
    |       2 |      1 |    3 |
    |       3 |      2 |    1 |
    |       3 |      4 |    2 |
    +---------+--------+------+
    6 rows in set (0.00 sec)
    
    mysql> select * from products where prod_id not in (select distinct prod_id from categories where main =1);
    +---------+-------+
    | prod_id | name  |
    +---------+-------+
    |       2 | prod2 |
    |       4 | prod4 |
    +---------+-------+
    2 rows in set (0.00 sec)
    

    【讨论】:

      【解决方案2】:

      SELECT * FROM products WHERE id NOT IN (SELECT product_id FROM product_categories WHERE main =1)

      【讨论】:

        【解决方案3】:

        从性能的角度来看,我发现 NOT IN 过去很麻烦。如果上面的建议很慢,你不妨试试……

        SELECT *
            FROM PRODUCTS
            WHERE NOT EXISTS (SELECT *
                                  FROM PRODUCT_CATEGORIES
                                  WHERE MAIN = 1 AND
                                        PRODUCT_CATEGORIES.PRODUCT_ID = PRODUCTS.ID)
        

        虽然作为 Knuth 格言的拥护者,我还是建议您首先使用您认为最简单的方式编写代码,并且仅在出现问题时才担心。

        【讨论】:

          【解决方案4】:

          如果您在“product_categories”中有字段“product_id”,并且有一个包含字段“id”的表“products”。

          查询看起来像 ;

          select p.*
          from products p
          left join product_categories pc on pc.product_id = p.id and pc.main = 1
          where pc.category_id is null
          group by p.id
          

          【讨论】:

          • 我不认为他会按预期的方式工作。
          猜你喜欢
          • 1970-01-01
          • 2016-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-24
          • 1970-01-01
          • 2018-02-10
          相关资源
          最近更新 更多