So erhalten Sie bestimmte Zeilen aus einer Tabelle mithilfe von „Gruppieren nach' und „Sortieren nach'
P粉794851975
P粉794851975 2023-09-12 17:54:20
0
1
507

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粉794851975
P粉794851975

Antworte allen(1)
P粉055726146

这可以使用 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;
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage