So suchen Sie nach Titeln und verwenden eine andere Spalte, um die Eindeutigkeit zu überprüfen
P粉244155277
P粉244155277 2024-04-02 21:49:55
0
1
478

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

Antworte allen(1)
P粉298305266

一个例子:

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 

此查询将返回所有副本(如果存在)。如果您只需要一份副本,请添加 DISTINCT。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage