Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/03/2011, 16h05   #1
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
Par défaut SELECT MIN() avec le bon identifiant

Bonjour tout le monde,
j'ai une table qui ressemble a ceci:
Citation:
produits
id_produit | id_produit_ref | prix | reduction | ...
1001 | 10150 | 19.00 | 0
1001 | 10151 | 19.00 | 0
1001 | 10152 | 19.00 | 15
1002 | 10153 | 15.00 | 0
1002 | 10154 | 13.00 | 0
...
j'aimerais afficher la ligne qui contient le prix le plus bas mais AVEC SON identifiant. j'ai fait ceci:
Code :
1
2
3
4
5
6
7
SELECT id_produit, 
id_produit_ref, 
MIN(prix) AS prix_original, 
MIN(prix * (1 - (reduction / 100))) AS prix 
FROM produits 
GROUP BY id_prod 
ORDER BY prix
La requête fonctionne bien, elle me retourne les résultats suivant:
Citation:
id_produit id_produit_ref prix_original prix
1001 10150 19.00 16.150000
1002 10153 13.00 13.000000
mais j'aimerais qu'il me retourne l'id_produit_ref 10152 au lieu de 10150 et 10154 au lieu de 10153

Sauriez vous comment faire?

MErci infiniment
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 07h50   #2
Membre Expert
 
Avatar de zoom61
 
Homme Vincent ...
Passionné d'informatique
Inscription : janvier 2005
Messages : 1 217
Détails du profil
Informations personnelles :
Nom : Homme Vincent ...
Âge : 39
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Passionné d'informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 1 217
Points : 1 506
Points : 1 506
Envoyer un message via Yahoo à zoom61 Envoyer un message via Skype™ à zoom61
Pour ma part j'aurai fait comme cela :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT 
   prd.id_produit, 
   prd.id_produit_ref, 
   prd.prix AS prix_original, 
   (prd.prix * (1 - (prd.reduction / 100))) AS prix 
FROM 
   produits prd
      INNER JOIN (SELECT
                            id_produit,
                            min(prix) prix,
                            max(reduction) reduction
                       FROM
                            produits
                       GROUP BY
                            id_produit) lst
      ON prd.id_produit = lst.id_produit
      AND prd.prix = lst.prix
      AND prd.reduction = lst.reduction
__________________
N'oubliez pas le Tag :

C'est en parvenant à nos fins par l'effort, en étant prêt à faire le sacrifice de profits immédiats en faveur du bien-être d'autrui à long terme, que nous parviendrons au bonheur caractérisé par la paix et le contentement authentique. [Dalaï Lama]
Je ne réponds pas aux messages privés s'ils sont liés à une question du forum

Mon site sur Developpez.com
zoom61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 08h51   #3
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
Wow! tout d'abord merci beaucoup ta reponse et puis je ne sais comment te remercier pour ton code miraculeux que je n'aurais jamais trouvé tout seul!!

je viens de le tester et ca marche bien. j'ai par contre un peu de mal a comprendre la jointure JOIN avec un SELECT, pourrais tu stp me l'expliquer??

Mille merci
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 08h59   #4
Membre Expert
 
Avatar de zoom61
 
Homme Vincent ...
Passionné d'informatique
Inscription : janvier 2005
Messages : 1 217
Détails du profil
Informations personnelles :
Nom : Homme Vincent ...
Âge : 39
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Passionné d'informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 1 217
Points : 1 506
Points : 1 506
Envoyer un message via Yahoo à zoom61 Envoyer un message via Skype™ à zoom61
Oups ! je viens de me rendre compte que ce code fonctionne bien pour ton cas, mais si tu as :
Code :
1
2
3
4
5
6
7
8
produits
id_produit | id_produit_ref | prix | reduction | ...
1001       |  10150         | 18.00   | 0 
1001       |  10151         | 19.00   | 0
1001       |  10152         | 19.00   | 15
1002       |  10153         | 15.00   | 0
1002       |  10154         | 13.00   | 0
...
Il va y avoir un problème car pour les 1001, je vais récupérer 18.00 et 15, et là pas de produits... quelle est la priorité des filtres prix ou reduction ?
__________________
N'oubliez pas le Tag :

C'est en parvenant à nos fins par l'effort, en étant prêt à faire le sacrifice de profits immédiats en faveur du bien-être d'autrui à long terme, que nous parviendrons au bonheur caractérisé par la paix et le contentement authentique. [Dalaï Lama]
Je ne réponds pas aux messages privés s'ils sont liés à une question du forum

Mon site sur Developpez.com
zoom61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 09h08   #5
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
Citation:
Il va y avoir un problème car pour les 1001, je vais récupérer 18.00 et 15, et là pas de produits... quelle est la priorité des filtres prix ou reduction ?
au fait la priorite est le prix final (prix * (1 - (reduction / 100))) Ex.
article1: 10.50 Euros et 0% de reduction
article2: 20.00 Euros et 50% de reduction
article2: 15.50 Euros et 10% de reduction

il me faudrait dans ce cas l'identifiant de l'article 2.
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 09h15   #6
Membre Expert
 
Avatar de zoom61
 
Homme Vincent ...
Passionné d'informatique
Inscription : janvier 2005
Messages : 1 217
Détails du profil
Informations personnelles :
Nom : Homme Vincent ...
Âge : 39
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Passionné d'informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 1 217
Points : 1 506
Points : 1 506
Envoyer un message via Yahoo à zoom61 Envoyer un message via Skype™ à zoom61
Dans ce cas là, je ferai plutôt :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT 
   prd.id_produit, 
   prd.id_produit_ref, 
   prd.prix AS prix_original, 
   prd.prix * (1 - (prd.reduction / 100)) AS prix 
FROM 
   produits prd,
   (SELECT
      id_produit,
      min(prix * (1 - (reduction / 100))) prix_final
   FROM
      produits
   GROUP BY
      id_produit) lst
WHERE
   prd.id_produit = lst.id_produit
   AND prd.prix * (1 - (prd.reduction / 100)) = lst.prix_final
Explication : L'insertion d'une sous-requête permet d'introduire un filtre supplémentaire. Ensuite, suivant le type de lien que tu auras entre ta requête et ta sous-requête, tu peux faire un INNER JOIN ou LEFT JOIN, ou sinon tu filtres avec le WHERE (comme ton cas)...
__________________
N'oubliez pas le Tag :

C'est en parvenant à nos fins par l'effort, en étant prêt à faire le sacrifice de profits immédiats en faveur du bien-être d'autrui à long terme, que nous parviendrons au bonheur caractérisé par la paix et le contentement authentique. [Dalaï Lama]
Je ne réponds pas aux messages privés s'ils sont liés à une question du forum

Mon site sur Developpez.com
zoom61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 13h40   #7
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
Cette requete foctionne mieux et marche a tous les coups.

j'ai egalement trouvé cette requete:
Code :
1
2
3
4
5
6
7
SELECT a.id_produit, a.id_produit_ref, a.prix prix_original, b.prix_reduc prix
FROM produits a
    JOIN (
        SELECT id_produit, MIN(prix * (1 - (reduction / 100.0))) prix_reduc 
        FROM produits
        GROUP BY id_produit
    ) b ON b.id_produit = a.id_produit AND b.prix_reduc = a.prix * (1 - (a.reduction / 100.0))
qu'en penses tu?
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 13h44   #8
Membre Expert
 
Avatar de zoom61
 
Homme Vincent ...
Passionné d'informatique
Inscription : janvier 2005
Messages : 1 217
Détails du profil
Informations personnelles :
Nom : Homme Vincent ...
Âge : 39
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Passionné d'informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 1 217
Points : 1 506
Points : 1 506
Envoyer un message via Yahoo à zoom61 Envoyer un message via Skype™ à zoom61
Je sais que cela fonctionne. Mais pour ma part, j’évite de faire des liens avec des champs calculés, la maintenance est plus facile quand le code est clair.
@ toi de voir.
__________________
N'oubliez pas le Tag :

C'est en parvenant à nos fins par l'effort, en étant prêt à faire le sacrifice de profits immédiats en faveur du bien-être d'autrui à long terme, que nous parviendrons au bonheur caractérisé par la paix et le contentement authentique. [Dalaï Lama]
Je ne réponds pas aux messages privés s'ils sont liés à une question du forum

Mon site sur Developpez.com
zoom61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 13h47   #9
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
et coté performance et rapidité d'execution, qu'est ce qui est mieux?
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 13h55   #10
Membre Expert
 
Avatar de zoom61
 
Homme Vincent ...
Passionné d'informatique
Inscription : janvier 2005
Messages : 1 217
Détails du profil
Informations personnelles :
Nom : Homme Vincent ...
Âge : 39
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Passionné d'informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 1 217
Points : 1 506
Points : 1 506
Envoyer un message via Yahoo à zoom61 Envoyer un message via Skype™ à zoom61
Il n'y a pas de différences significatives, car c'est l'optimiseur qui fait sa "mayonnaise" donc que tu utilises un INNER JOIN ou WHERE, cela n'aura aucun incidence sur la performance et rapidité d'execution.
__________________
N'oubliez pas le Tag :

C'est en parvenant à nos fins par l'effort, en étant prêt à faire le sacrifice de profits immédiats en faveur du bien-être d'autrui à long terme, que nous parviendrons au bonheur caractérisé par la paix et le contentement authentique. [Dalaï Lama]
Je ne réponds pas aux messages privés s'ils sont liés à une question du forum

Mon site sur Developpez.com
zoom61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 14h02   #11
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
OK Merci pour tout
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 14h37   #12
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
j'ai par contre du mal a l'integrer a ma requete initiale:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT p.id_prod, p.id_theme, pr.id_prod_ref, pr.stock, MIN(pr.price) AS price_org, MIN(pr.price * (1 - (pr.discount / 100))) AS price, pr.discount, pt.title, av.attr_val AS material
FROM products_references AS pr
INNER JOIN products AS p ON pr.id_prod = p.id_prod
INNER JOIN products_info_trans AS pt ON p.id_prod = pt.id_prod
INNER JOIN products_ref_vars AS pv ON pr.id_prod_ref = pv.id_prod_ref
INNER JOIN attributes_values AS av ON pv.id_attr_val = av.id_attr_val
WHERE p.id_cat = $id_cat
AND p.active = 'y'
AND pt.lang_iso = '$lang_iso'
AND av.id_attr = 109
GROUP BY pr.id_prod, material
ORDER BY price
comment integreras tu ta requete sachant que je regroupe les produits par identifiant et par matiere??
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 18h16   #13
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Sinon, tu peux également essayer la requête suivante :
Code :
1
2
3
4
5
6
SELECT p1.id_produit, p1.id_produit_ref, p1.prix AS prix_original, p1.prix * (1 - (p1.reduction / 100) AS prix 
FROM produits p1
INNER JOIN produits p2 ON p1.id_produit = p2.id_produit
GROUP BY p1.id_produit, p1.id_produit_ref, p1.prix, p1.reduction
HAVING p1.prix * (1 - (p1.reduction / 100) = MIN(p2.prix * (1 - (p2.reduction / 100))
ORDER BY prix;
A tester, c'est fait de tête et j'avoue qu'à la lecture des différentes requêtes précédente, je ne suis pas trop certain de ce que tu attends de la requête.

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 20h06   #14
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
ca ne marche pas, voici l'erreur que mysql me renvoie:
Citation:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS prix FROM produits p1 INNER JOIN produits p2 ON p1.id_produit = p2.id_produi' at line 1
au fait ce que je veux est très simple.
j'aimerais afficher les produit d'une certaine catégorie, un produit peut exister en plusieurs couleurs, plusieurs tailles et plusieurs matières.
dans l'affichage, je séparerai les produits de différentes matières. si par exemple le produit A existe en 2 matières et chaque matière existe en 3 couleurs et 4 tailles, j'afficherai alors 2 vignettes avec le prix le moins cher de chaque produit par matière.

j'espère être clair
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2011, 12h23   #15
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
C'est le problème d'écrire des requêtes sans les tester
Il manquait des parenthèses :
Code :
1
2
3
4
5
6
SELECT p1.id_produit, p1.id_produit_ref, p1.prix AS prix_original, p1.prix * (1 - (p1.reduction / 100)) AS prix 
FROM produits p1
INNER JOIN produits p2 ON p1.id_produit = p2.id_produit
GROUP BY p1.id_produit, p1.id_produit_ref, p1.prix, p1.reduction
HAVING p1.prix * (1 - (p1.reduction / 100)) = MIN(p2.prix * (1 - (p2.reduction / 100)))
ORDER BY prix;
Attention, je n'ai pas plus testé celle-là que la précédente
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2011, 14h21   #16
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
ca marche! mais je ne sais du coups plus quoi faire et quelle requette utiliser... Que faire???
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2011, 22h49   #17
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
A toi de voir .
Mais, en théorie, moins il y a de sous-requête et meilleures sont les performances (en théorie...).

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 13h32   #18
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
OK merci!

y a juste un petit truc que je ne comprends pas:
Code :
GROUP BY p1.id_produit, p1.id_produit_ref, p1.prix, p1.reduction
pourquoi ca ne marche pas si je mets que le p1.id_produit ? il me renvoie une erreur: Unknown column 'p1.reduction' in 'having clause'
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 14h17   #19
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Normalement, on met dans GROUP BY toutes les colonnes du SELECT qui ne figurent pas dans une fonction d'agrégation (SUM, COUNT, AVG...). Tout autre SGBD que MySQL renverrait alors une erreur.
Un peu plus de détail dans l'article suivant : http://cedric-duprez.developpez.com/...fier-group-by/

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 17h15   #20
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
Hello,
J'ai détecter un cas ou les 2 requêtes ne marcheront pas bien
Code :
1
2
3
id_prod | id_prod_ref | prix | reduc
1001 | 10015 | 13.50 | 0
1001 | 10017 | 15.00 | 10
les 2 requêtes me retourneront 2 fois 1001 car le prix final est le même!
La solution que j'ai trouvé est de rajouter un GROUP BY id_prod a la fin, mais est ce bon?

J'aurais encore 1 toute petite question svp:
Concernant les commandes, je prévois 2 tables:
1- commandes (id_commande, id_client, frais_livraison, date, ...)
2- commandes_details (id_commande, id_prod_ref, quantite, prix, reduction)

Dois-je rajouter un champ prix_total dans la table commande ou devrais je plutôt le récupérer avec un SUM() sur la table commande_details??
Pareil sur la table commandes_details, dois je mettre un champ prix_reduction ou plutôt le calculer a partir des champs prix et reduction??

Merci
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h56.


 
 
 
 
Partenaires

Hébergement Web