Maison > Questions et réponses > le corps du texte
J'ai une table comme celle-ci :
tmp_id | Disponibilité des produits (0 et 1) | est_disponible(0 et 1) | stock_count (entier) | product_id (entier) |
---|---|---|---|---|
1 | 1 | 1 | 0 | 1 |
2 | 1 | 1 | 4 | 1 |
Je dois me procurer le premier produit disponible pour chacun product_id
.
Les produits disponibles doivent d'abord être vérifiés product_availability
,然后检查is_available
,最后检查stock_count
。 (当 product_availability
为 1
时,产品可用,然后 is_available
为 1
并且库存中至少有一种产品1
. )
Je souhaite afficher en premier les produits disponibles, s'il n'y a pas de produits disponibles, peu importe le produit affiché (en cas d'indisponibilité, le premier produit convient également).
(Dans l'exemple ci-dessus, je dois d'abord me procurer le produit pour tmp_id
为 2
.)
Question : Ma question est de savoir comment écrire une requête MYSQL pour répondre à mes besoins ?
Je peux obtenir mes produits dans l'ordre que je souhaite en utilisant la commande suivante, mais je ne sais pas quoi faire ensuite pour obtenir le premier produit existant en utilisant GROUP BY
:
SELECT pa.* FROM `product_advanced` AS `pa` ORDER BY `pa`.`product_availability` DESC, `pa`.`is_available` DESC, `pa`.`stock_count` DESC
Remarque : Bien sûr, ce n'est qu'une simple démo de ce que j'ai, le code réel est plus complexe et comporte plusieurs jointures et autres éléments.
P粉0557261462023-09-13 14:05:48
Cela peut être fait en utilisant row_number()
qui renvoie le numéro de ligne unique pour chaque ligne de la partition
WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY product_availability DESC, is_available DESC, stock_count DESC) AS rn FROM product_advanced ) SELECT tmp_id, product_availability, is_available, stock_count, product_id FROM cte WHERE rn = 1;