suchen

Heim  >  Fragen und Antworten  >  Hauptteil

So erhalten Sie bestimmte Zeilen aus einer Tabelle mithilfe von „Gruppieren nach“ und „Sortieren nach“

Ich habe einen Tisch wie diesen:

tmp_id Produktverfügbarkeit (0 und 1) is_available(0 und 1) stock_count(integer) product_id (Ganzzahl)
1 1 1 0 1
2 1 1 4 1

Ich muss jeweils das erste verfügbare Produkt besorgen product_id. Verfügbare Produkte müssen zunächst geprüft werden product_availability,然后检查is_available,最后检查stock_count。 (当 product_availability1 时,产品可用,然后 is_available1 并且库存中至少有一种产品1. )

Ich möchte zuerst die verfügbaren Produkte anzeigen. Wenn keine Produkte verfügbar sind, spielt es keine Rolle, welches Produkt angezeigt wird (im Falle einer Nichtverfügbarkeit funktioniert auch das erste).

(Im obigen Beispiel muss ich zuerst das Produkt für tmp_id2 besorgen.)

Frage: Meine Frage ist, wie schreibe ich eine MYSQL-Abfrage, um meine Anforderungen zu erfüllen?

Mit dem folgenden Befehl kann ich meine Produkte in der gewünschten Reihenfolge abrufen, weiß aber nicht, was ich als Nächstes tun soll, um das erste vorhandene Produkt mit GROUP BY zu erhalten:

SELECT
    pa.*
FROM
    `product_advanced` AS `pa`
ORDER BY
    `pa`.`product_availability` DESC,
    `pa`.`is_available` DESC,
    `pa`.`stock_count` DESC
    

Hinweis: Natürlich ist dies nur eine einfache Demo von dem, was ich habe. Der eigentliche Code ist komplexer und enthält mehrere Verknüpfungen und andere Dinge.

P粉794851975P粉794851975430 Tage vor488

Antworte allen(1)Ich werde antworten

  • P粉055726146

    P粉0557261462023-09-13 14:05:48

    这可以使用 row_number() 来完成,返回分区内每行的唯一行号

    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;

    Antwort
    0
  • StornierenAntwort