Compte tenu d'un produit et d'une table de commande. J'aimerais obtenir des produits qui ne sont jamais commandés ou commandés, mais le statut de commande n'était pas de succès jamais.
Pour obtenir des produits Jamais commandé, j'utilise cette requête: P>
SELECT * FROM products p LEFT JOIN orders o ON p.product_id=o.product_id WHERE (order_id IS NULL OR (order_id>0 AND (order_status=5 OR order_status=9)) GROUP BY p.product_id;
3 Réponses :
Vous devez déplacer la condition des colonnes liées à des tables jointes EFT dans la clause L'utilisation de la colonne liée à la table jointe à gauche fonctionne comme une jointure intérieure (et ne pas Produire résultat pour ces lignes) P> et vous ne devez pas utiliser de groupe par sans fonction d'agrégation, cela produisent un résultat imprévisible pour la version MySQL <5.7 et n'est pas autorisé par défaut pour la version MySQL> = 5.7 P> < p> Utilisez une fonction d'agrégation distincte ou ajoutée pour la colonne non invove dans le groupe par clause p>
Que diriez-vous d'utiliser une sous-requête.
SELECT *
FROM products p
WHERE p.product_id NOT IN (
--This query returns all successfull orders
select product_id from orders where order_id > 0 and order_status = 4
)
Utilisez la logique de votre première requête et ajoutez une condition supplémentaire dans la clause ON: Notez que vous n'avez pas besoin de Cette requête est équivalente à p> et ceci peut être lu comme "Sélectionner tous les produits qui n'ont pas de commandes avec Status = 4 (Succès)". P> Si votre logique est plutôt "Sélectionnez tous les produits qui n'ont pas de commandes ou n'ont que des commandes avec statut 5 ou 9 "- alors vous pouvez utiliser p> groupe par code> ici, puisque Vous obtiendrez une ligne par produit de toute façon (en supposant que les ordres.ordr_id sont une clé primaire). P>
Quelles sont les valeurs possibles pour
ordre_status code>? Ne pouvions-tu pas dire "des produits qui n'ont pas de commande_status = 4"?