【问题标题】:Select SQL where value does not exist选择值不存在的 SQL
【发布时间】:2017-02-20 09:26:47
【问题描述】:

我有两列 product_idcategory_id。 我想选择所有没有category_id = 90product_id

我使用这个查询,但它返回 null。我做错了什么?

SELECT * 
FROM  `oc_product_to_category` 
WHERE NOT EXISTS (
  SELECT * 
  FROM  `oc_product_to_category` 
  WHERE category_id = 90
)

【问题讨论】:

  • SELECT * FROM oc_product_to_category where category_id<>90

标签: mysql sql select


【解决方案1】:

您没有关联内部和外部查询。如果至少有一个带有category_id = 90 的产品,则内部查询将返回一些行,因此NOT EXISTS 条件将始终为假,而外部查询将不返回任何行。您需要添加一个条件来指定内部查询和外部查询引用同一产品:

SELECT * 
FROM  `oc_product_to_category` a
WHERE NOT EXISTS (
  SELECT * 
  FROM   `oc_product_to_category` b
  WHERE  category_id = 90 AND
         a.product_id = b.product_id -- Here!
)

【讨论】:

  • 谢谢 Mureinik,但我收到了这个错误。#1054 - '订单子句'中的未知列 'oc_product_to_category.product_id' .. 有什么想法吗?
  • 我使用别名(ab)来区分内部查询中的oc_product_to_category 和外部查询中的oc_product_to_category。您还需要在order by 子句中使用这些别名(即order by a.product_id)。
  • 谢谢!添加'order by a.product_id'后效果很好
【解决方案2】:

试试这个

SELECT * 
FROM  `oc_product_to_category` 
WHERE category_id <> **90**

【讨论】:

  • 这还将返回具有多个类别的产品,其中一个是 90。我认为这不是 OP 所追求的。
  • 假设每个产品只属于一个类别。无论如何谢谢:)
【解决方案3】:

您可以查询oc_product表并检查oc_product_to_category表中没有对应条目且category_id等于90的产品。

SELECT *
FROM `oc_product`
WHERE product_id NOT IN
    (SELECT product_id
    FROM `oc_product_to_category`
    WHERE category_id = 90)

【讨论】:

  • 这还将返回具有多个类别的产品,其中一个是 90。我认为这不是 OP 所追求的。
【解决方案4】:
SELECT * 
FROM  `oc_product_to_category` where product_id NOT IN (SELECT product_id
FROM  `oc_product_to_category where category_id = 90)

【讨论】:

    【解决方案5】:

    你的查询应该是这样的

    SELECT * 
    FROM  `oc_product_to_category` m 
    WHERE NOT EXISTS (
    SELECT * 
    FROM  `oc_product_to_category` 
    WHERE m.category_id = 90
    )
    

    您可以通过多种方式获得这些结果,例如

    SELECT * 
    FROM  `oc_product_to_category` 
    WHERE category_id <> 90
    
    
    
    
    SELECT * 
    FROM  `oc_product_to_category` 
    WHERE category_id != 90
    
    
    SELECT * 
    FROM  `oc_product_to_category` 
    having category_id <> 90
    
    
    
    SELECT * 
    FROM  `oc_product_to_category` 
    WHERE category_id NOT IN
    (SELECT * 
    FROM  `oc_product_to_category` 
    WHERE category_id = 90)
    

    【讨论】:

      【解决方案6】:

      试试这个:

      SELECT * 
      FROM  `oc_product_to_category`
      WHERE category_id <> 90
      

      【讨论】:

      • 这还将返回具有多个类别的产品,其中一个是 90。我认为这不是 OP 所追求的。
      【解决方案7】:

      选择 * 来自oc_product_to_category 在哪里category_id 90 ;

      【讨论】:

      • 这还将返回具有多个类别的产品,其中一个是 90。我认为这不是 OP 所追求的。
      【解决方案8】:

      试试:

      SELECT * 
      FROM  oc_product_to_category 
      WHERE category_id not in ('90')
      

      【讨论】:

        【解决方案9】:

        试试这个

        SELECT * 
        FROM your_Name 
        WHERE category_id NOT LIKE '90'
        

        【讨论】:

        • 谢谢,但这似乎只排除了 category_id = 90 的那些,而不是告诉我哪些缺少 category_id = 90。
        【解决方案10】:

        试试这个

        SELECT * FROM oc_product_to_category where category_id != 90
        

        (或)

        SELECT * FROM oc_product_to_category where category_id <> 90
        

        【讨论】:

          猜你喜欢
          • 2017-09-04
          • 1970-01-01
          • 2021-07-02
          • 2011-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-13
          • 2015-10-19
          相关资源
          最近更新 更多