【问题标题】:SQL NOT IN QuerySQL NOT IN 查询
【发布时间】:2009-11-23 05:56:41
【问题描述】:

谁能帮我解决这个 MySQL 查询?

SELECT p.ProductID, 
       p.StoreID, 
       p.DiscountPercentage 
 FROM Products p 
WHERE p.IsSpecial = 1 
  AND p.SpecialDate >= date_sub(now(),interval 15 minute) 
  AND p.DiscountPercentage >= ?DiscountPercentage 
  AND p.ProductID NOT IN (SELECT lf.LiveFeedID 
                            From LiveFeed lf 
                           WHERE p.ProductID = lf.ProductID 
                             AND lf.DateAdded >= date_sub(now(),interval 30 day)) 
  AND p.StoreID NOT IN (SELECT lf.LiveFeedID 
                          From LiveFeed lf 
                         WHERE p.StoreID = lf.StoreID 
                           AND lf.DateAdded >= date_sub(now(),interval 6 hour)) 
ORDER BY p.StoreID, p.DiscountPercentage DESC

我正在尝试加入过去 30 天内 ProductID 不在 livefeed 表中的位置,并且在过去 6 小时内 storeid 不在 livefeed 表中的位置,但它似乎不起作用。知道我做错了什么吗?

【问题讨论】:

  • 根据您的评论更新答案

标签: mysql sql subquery localized notin


【解决方案1】:

乍一看,您的第一个子查询应该选择ProductID,而不是LiveFeedID,而您的第二个子查询应该选择StoreID而不是LiveFeedID

【讨论】:

  • 啊,你是对的!我知道我错过了一些简单的事情!谢谢!
【解决方案2】:

我来晚了:

  SELECT p.ProductID, 
         p.StoreID, 
         p.DiscountPercentage 
    FROM Products p 
   WHERE p.IsSpecial = 1 
     AND p.SpecialDate >= date_sub(now(),interval 15 minute) 
     AND p.DiscountPercentage >= ?DiscountPercentage 
     AND p.ProductID NOT IN (SELECT lf.productid
                               FROM LIVEFEED lf
                              WHERE lf.DateAdded >= DATE_SUB(NOW(), INTERVAL 30 DAY)) 
     AND p.storeid NOT IN (SELECT lf.storeid
                             FROM LIVEFEED lf
                            WHERE lf.DateAdded >= DATE_SUB(NOW(), INTERVAL 6 HOUR)) 
ORDER BY p.StoreID, p.DiscountPercentage DESC

您正在使用 EXISTS 语法和相关子查询...

我正在尝试为每家商店获得最高折扣。

在这种情况下,使用:

  SELECT p.StoreID, 
         MAX(p.DiscountPercentage)
    FROM Products p 
   WHERE p.IsSpecial = 1 
     AND p.SpecialDate >= date_sub(now(),interval 15 minute) 
     AND p.DiscountPercentage >= ?DiscountPercentage 
     AND p.ProductID NOT IN (SELECT lf.productid
                               FROM LIVEFEED lf
                              WHERE lf.DateAdded >= DATE_SUB(NOW(), INTERVAL 30 DAY)) 
     AND p.storeid NOT IN (SELECT lf.storeid
                             FROM LIVEFEED lf
                            WHERE lf.DateAdded >= DATE_SUB(NOW(), INTERVAL 6 HOUR)) 
GROUP BY p.storeid
ORDER BY p.StoreID, p.DiscountPercentage DESC

【讨论】:

  • 谢谢!有没有一种简单的方法可以在查询中只允许一个 storeID?
  • 只有 1 个?将LIMIT 1 标记到最后。但我需要了解更多关于如何确定要返回哪个特定 storeid...
  • 好吧,就像现在的查询一样,它将返回来自同一商店的多个产品 ID。我需要对查询中的每个 storeid 限制为 1。我正在努力争取每家商店的最高折扣。
猜你喜欢
  • 2018-10-18
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多