1
votes

Comment obtenir les données de ligne associées à partir de la valeur minimale

J'essaie d'obtenir le prix minimum (prix total) à partir d'une colonne groupée (sku), puis d'obtenir les données fournisseur correspondantes (fournisseur) associées au prix le plus bas résultant.

Exemple de tableau

$query  = "SELECT sku, supplier,  MIN(totalprice) FROM pricetable GROUP BY sku";
$result = mysqli_query($conn, $query);
while($row = mysqli_fetch_array($result)) {
    echo "The cheapest  ". $row['sku']. " is £" .$row['MIN(totalprice)']." from ".$row['supplier'];

J'essaie de regrouper la colonne sku et d'obtenir le prix le plus bas et le fournisseur associé,

sku     supplier    totalprice
505     Sup1        20
505     Sup2        30
505     Sup3        25
605     Sup1        100
605     Sup2        97
605     Sup3        111

Par exemple,

le groupe 505 a le prix le plus bas de 20 du fournisseur Sup1

le groupe 606 a le prix le plus bas de 97 du fournisseur Sup2

Le code ci-dessus me donne le prix le plus bas pour chaque groupe sku, mais je ne peux pas obtenir le nom du fournisseur associé.


3 Réponses :


2
votes

Vous pouvez essayer ci-dessous - en utilisant la sous-requête corrélée

SELECT sku, supplier, totalprice FROM pricetable t1
where totalprice in 
    (select MIN(totalprice) from pricetable t2 where t1.sku=t2.sku GROUP BY t2.sku)


2 commentaires

Je pense que votre solution est meilleure que la mienne. Cela fonctionne dans [l'ancien maintenant] MySQL 5.x. Vote positif.


Salut, merci j'ai essayé mais cela ne me donne que le prix le plus bas pour le sku 505, rien pour le prochain sku 605, j'ai gardé ma (boucle while) je suppose que je n'ai pas besoin de changer cela?



0
votes

Dans MySQL 8.x, vous pouvez faire:

select *
from pricetable
where rank() over(partition by sku order by totalprice) = 1


0 commentaires

0
votes

Une autre façon courante de procéder consiste à créer une table dérivée avec le sku et le prix total minimum par sku et à la rejoindre à nouveau à votre ensemble de données de base.

SELECT PT.sku, PT.supplier,  PT.totalprice
FROM pricetable PT
INNER JOIN (SELECT min(totalprice) MTP, SKU 
            FROM pricetable 
            GROUP BY sku) B
 on PT.SKU = B.SKU
and PT.MTP = PT.totalprice


0 commentaires