Heim > Fragen und Antworten > Hauptteil
Ich habe einige abgekratzte Produktdaten in der Datenbank und möchte diese auf meiner Website verwenden. Ich möchte eine Abfrage schreiben, die alle Artikel mit dem Titel „%EXAMPLE%“, aber nur eindeutige Produkte zurückgibt.
Das Problem besteht darin, dass ich mehrere Zeilen für einen Artikel habe und nur eine Zeile pro Produkt zurückgeben möchte (ich scrape jeden Tag, also erhalte ich jeden Tag zusätzliche Zeilen pro Artikel). Der einzige Unterschied zwischen den Zeilen besteht darin, dass sie ein anderes Datum und einen anderen Preis haben, da dies der Preisverlauf ist, nach dem ich suche.
Beispiel: Wir haben 3 Artikel: rosa Schokolade, rosa Äpfel und rosa Birnen. Für jeden Gegenstand gibt es 3 Reihen, weil ich dreimal gekratzt habe. Zum Beispiel (für dieses Beispiel habe ich nicht alle anderen Spalten hinzugefügt):
Produkt-ID | Titel | Preis | Verfügbar |
---|---|---|---|
ABC123DEF | Rosa Apfel | 0,47 | 1 |
ABC123DEF | Rosa Apfel | 0,42 | 1 |
ABC123DEF | Rosa Apfel | 0,41 | 1 |
ABC333FHG | Rosa Birne | 0,41 | 1 |
ABC333FHG | Rosa Birne | 0,41 | 1 |
ABC333FHG | Rosa Birne | 0,41 | 1 |
FH5845FJG | Rosa Schokolade | 0,41 | 1 |
FH5845FJG | Rosa Schokolade | 0,41 | 1 |
FH5845FJG | Rosa Schokolade | 0,41 | 1 |
Das Ergebnis, das ich erhalten möchte, ist:
Produkt-ID | Titel | Preis | Verfügbar |
---|---|---|---|
ABC123DEF | Rosa Apfel | 0,47 | 1 |
ABC333FHG | Rosa Birne | 0,41 | 1 |
FH5845FJG | Rosa Schokolade | 0,41 | 1 |
Anscheinend muss ich nach dem Titel suchen und dann die doppelten Produkt-IDs herausfiltern, um die richtigen Ergebnisse zu erhalten. Aber ich weiß nicht, wie ich es machen soll.
Irgendwelche Ideen?
P粉2983052662024-04-03 00:53:42
一个例子:
WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY productId ORDER BY price DESC) rn FROM test ) DELETE test FROM test NATURAL JOIN cte WHERE cte.rn > 1;
查询保存每个产品 ID 的最高价格行,并删除该产品的其他行。
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=40df8e8e4b3eb206e0f73b7ce3a70a a5一个>
注意 - 必须存储的每个完整行都是唯一的(必须删除的行可能具有完整的重复项)。
WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY productId ORDER BY price DESC) rn FROM test ) SELECT * FROM cte WHERE rn = 1;
此查询不需要行是唯一的,在这种情况下仅返回一个行副本。如果您需要所有副本,请使用 RANK() 或 DENSE_RANK() 而不是 ROW_NUMBER()。
MySQL 5.x 版本的解决方案。
SELECT * FROM test WHERE NOT EXISTS ( SELECT NULL FROM test t WHERE test.productId = t.productId AND test.price < t.price );
此查询将返回所有副本(如果存在)。如果您只需要一份副本,请添加 DISTINCT。