2009-11-23 9 views
0

Quelqu'un peut-il m'aider avec cette requête 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 

J'essaie rejoindre où le ProductID est pas dans la table de LiveFeed au cours des 30 derniers jours et où le StoreID est pas dans la table de LiveFeed au cours des 6 dernières heures, mais il ne semble pas fonctionner . Une idée de ce que je fais mal?

+0

réponse Mise à jour en fonction de votre commentaire –

Répondre

3

En bref, il semble que votre premier sous-requête doit être la sélection ProductID, pas LiveFeedID et votre deuxième sous-requête doit être la sélection StoreID pas LiveFeedID

+0

ahhh vous avez raison! Je savais que c'était quelque chose de simple que je manquais! Merci! – mike

3

Je suis trop tard:

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 

Vous utilisaient la syntaxe EXISTS avec une sous-requête corrélée ...

J'essaie d'obtenir le meilleur rabais pour chaque magasin.

Dans ce cas, utilisez:

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

Merci! Existe-t-il un moyen simple d'autoriser seulement un storeID dans la requête? – mike

+0

Seulement 1? Tapez 'LIMIT 1' sur la fin. Mais j'ai besoin d'en savoir plus sur la façon de déterminer quel storeid spécifique retourner ... –

+0

Eh bien, comme la requête est maintenant, il retournera plusieurs ID de produit du même magasin. J'ai besoin d'une limite de 1 pour chaque storeid dans la requête. J'essaie d'obtenir le meilleur rabais pour chaque magasin. – mike