2009-11-23 3 views
0

Может ли кто-нибудь помочь мне с этим запросом MySQL?SQL NOT IN Query

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 

Я пытаюсь присоединиться где ProductID не в таблице livefeed в течение последних 30 дней, и где StoreID не в таблице livefeed в течение последних 6 часов, но не кажется, что это будет работать , Любая идея, что я делаю неправильно?

+0

Обновленный ответ, основанный на ваш комментарий –

ответ

3

На первый взгляд, может показаться, что ваш первый подзапрос должен выбрать ProductID, не LiveFeedID и ваш второй подзапрос должен выбрать StoreID не LiveFeedID

+0

аааа вы правильно! Я знал, что это было что-то простое, что мне не хватало! Благодаря! – mike

3

Я слишком поздно:

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 
+0

Спасибо! Есть ли простой способ разрешить только один идентификатор хранилища в запросе? – mike

+0

Только 1? Tack 'LIMIT 1' до конца. Но мне нужно будет узнать больше о том, как определить, какой конкретный storeid будет возвращен ... –

+0

Ну, так как запрос теперь, он вернет несколько идентификаторов продукта из одного и того же хранилища. Мне нужно ограничение по 1 для каждого хранилища в запросе. Я пытаюсь получить максимальную скидку для каждого магазина. – mike