recherche

Maison  >  Questions et réponses  >  le corps du texte

Comment obtenir des lignes spécifiques d'un tableau en utilisant "group by" et "order by"

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_availability1 时,产品可用,然后 is_available1 并且库存中至少有一种产品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_id2.)

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粉794851975P粉794851975430 Il y a quelques jours485

répondre à tous(1)je répondrai

  • P粉055726146

    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;

    répondre
    0
  • Annulerrépondre