Comment rechercher un titre et utiliser une autre colonne pour vérifier l'unicité
P粉244155277
P粉244155277 2024-04-02 21:49:55
0
1
515

J'ai des données de produits récupérées dans la base de données et je souhaite les utiliser sur mon site Web. Je souhaite écrire une requête qui renvoie tous les éléments portant le titre "%EXAMPLE%" mais uniquement des produits uniques.

Le problème est que j'ai plusieurs lignes pour 1 article et je souhaite seulement renvoyer 1 ligne par produit (je gratte tous les jours, donc j'obtiens des lignes supplémentaires par article chaque jour). La seule différence entre les lignes est qu'elles ont une autre date et un autre prix, puisque c'est l'historique des prix que je recherche.

Exemple : Nous avons 3 articles : chocolat rose, pommes roses et poires roses. Il y a 3 rangées pour chaque article car j'ai gratté 3 fois. Par exemple (pour les besoins de cet exemple, je n'ai pas ajouté toutes les autres colonnes) :

ID produit Titre Prix Disponible
ABC123DEF Pomme Rose 0,47 1
ABC123DEF Pomme Rose 0,42 1
ABC123DEF Pomme Rose 0.41 1
ABC333FHG Poire Rose 0.41 1
ABC333FHG Poire Rose 0.41 1
ABC333FHG Poire Rose 0.41 1
FH5845FJG Chocolat Rose 0.41 1
FH5845FJG Chocolat Rose 0.41 1
FH5845FJG Chocolat Rose 0.41 1

Le résultat que je souhaite obtenir est :

ID produit Titre Prix Disponible
ABC123DEF Pomme Rose 0,47 1
ABC333FHG Poire Rose 0.41 1
FH5845FJG Chocolat Rose 0.41 1

Il semble que je doive rechercher le titre, puis filtrer les identifiants de produit en double afin d'obtenir les résultats corrects. Mais je ne sais pas comment faire.

Des idées ?

P粉244155277
P粉244155277

répondre à tous(1)
P粉298305266

Un exemple :

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;

La requête enregistre la ligne de prix le plus élevé pour chaque ID de produit et supprime les autres lignes de ce produit.

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=40df8e8e4b3eb206e0f73b7ce3a70a a5一个>

Remarque : chaque ligne complète qui doit être stockée est unique (les lignes qui doivent être supprimées peuvent avoir des doublons complets).


WITH
cte AS ( 
    SELECT *, ROW_NUMBER() OVER (PARTITION BY productId ORDER BY price DESC) rn
    FROM test
)
SELECT *
FROM cte
WHERE rn = 1;

Cette requête ne nécessite pas que les lignes soient uniques, auquel cas une seule copie de la ligne est renvoyée. Si vous avez besoin de toutes les copies, utilisez RANK() ou DENSE_RANK() au lieu de ROW_NUMBER().


Solution pour la version MySQL 5.x.

SELECT *
FROM test
WHERE NOT EXISTS ( 
    SELECT NULL
    FROM test t
    WHERE test.productId = t.productId
      AND test.price 

Cette requête renverra toutes les répliques si elles existent. Si vous n’avez besoin que d’une seule copie, ajoutez DISTINCT.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal