Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > SQLite
SQLite Forum d'entraide SQLite
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 13/02/2011, 15h26   #1
Membre à l'essai
 
Inscription : janvier 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 65
Points : 21
Points : 21
Par défaut min avec un parametre

salut à tous,
encore une fois, j'ai besoin d'aide :p

alors voila, je voulais faire un truc qui me semblait ultra simple jusqu'au moment ou j'ai commencé à ecrire la requete

j'ai deux tables avec une relation m,n donc une table de relation entre les deux, et...
Ca sera plus facile avec un exemple:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TABLE A : pk_id ; name
TABLE B : pk_id ; supplier ; price
TABLE R : fk_idA ; fk_idB
 
A:
1 ; toto
2 ; tutu
 
B:
1 ; mouser ; 5
2 ; farnell ; 6
3 ; mouser ; 4
 
R:
1 ; 1
1 ; 2
2 ; 3
la jointure de ces deux tables presente bien :
Code :
1
2
3
1 ; toto ; 1 ; mouser ; 5
1 ; toto ; 2 ; farnell ; 6
2 ; tutu ; 3 ; mouser ; 4
je voudrais, pour chaque element de la table A, obtenir seulement la ligne avec le prix min:
Code :
1
2
1 ; toto ; 1 ; mouser ; 5
2 ; tutu ; 3 ; mouser ; 4
or quand j'essaye le min sur ma requete, il filtre toutes les lignes de la jointure:
Code :
2 ; tutu ; 3 ; mouser ; 4
je comprends bien pourquoi, mais je n'arrive pas à ecrire la requete qui filtrerai le min seulement pour les lignes avec A.id identiques...

voilà toujours ma jointure, j'ai essayé toutes sortes de select autour sans success...
Code :
1
2
 
R JOIN A,B ON R.fk_idA = A.id AND R.fk_idB = B.id
J'espère qu'il existe une solution simple, et merci d'avance pour vos réponses.


PS:
post un peu long, alors merci aussi à ceuss' qui ont lu jusqu'au bout
copeau31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 22h57   #2
Nouveau Membre du Club
 
Inscription : septembre 2010
Messages : 21
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : septembre 2010
Messages : 21
Points : 29
Points : 29
Ce n'est pas un problème réellement lié à SQLite, mais plutôt à du SQL directement. Et comme tu ne dis pas ce que tu as essayé exactement, je ne sais pas si ce que je vais utiliser te parle ou pas. N'hésite pas à poser des questions (ou à ma maudire parce que je sous-estime tes connaissances ).

Alors la solution que je peux proposer est la suivante :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT A.id, MinTable.name, B.id, B.supplier, MinTable.minprice
FROM 
      (
        SELECT A.name, Min(B.price) AS minprice
        FROM R
             JOIN A 
                  ON R.idA = A.id
             JOIN B
                  ON R.idB = B.id               
        GROUP BY A.name
       ) MinTable
          JOIN A          
               ON MinTable.name = A.name               
          JOIN B          
               ON MinTable.minprice = B.price

Une petite explication : je passe par un SELECT intermédiaire afin de ne me concentrer que sur les colonnes concernées par la clause GROUP BY. Ayant obtenu les lignes correspondantes, je vais ensuite chercher les valeurs dans les autres colonnes en utilisant les données obtenues comme "clés".

Est-ce que cela répond à ta question ?

En tout cas, merci pour la problématique, j'ai bien aimé y réfléchir !
Je ne sais pas si c'est l'unique solution et si c'est la plus optimisée...
Plantouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 00h22   #3
Membre à l'essai
 
Inscription : janvier 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 65
Points : 21
Points : 21
ah c'est sioux !
merci pour ta réponse.
Je n'ai pas mis mes essais parce que ca n'apportait rien et que d'autre part le message etait bien assez long

Y'a de l'idée dans ton truc, je regarderai tout ca demain soir !
copeau31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 16h58   #4
Membre à l'essai
 
Inscription : janvier 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 65
Points : 21
Points : 21
Et voila la solution finale :
(j'ai une colonne en plus dans B (par exemple name) qui permet de regrouper plus simplement les elements de B)

Code :
1
2
3
SELECT A.name, B.supplier, min(B.price)
FROM R JOIN A,B ON R.idA = A.id AND R.idB = B.id
GROUP BY B.name
j'ai l'impression que c'était tout bête mais ça repose sur le fait d'avoir une colonne de regroupement dans B, que je n'avais pas prévue au début.

Merci Plantouille :p
copeau31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 11h18   #5
Nouveau Membre du Club
 
Inscription : septembre 2010
Messages : 21
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : septembre 2010
Messages : 21
Points : 29
Points : 29
Citation:
Envoyé par copeau31 Voir le message
j'ai l'impression que c'était tout bête mais ça repose sur le fait d'avoir une colonne de regroupement dans B, que je n'avais pas prévue au début.
Petite question à propos de cette colonne de regroupement (je suis curieux).
Tu y mets quoi ? A chaque fois la même valeur ?

C'est juste que la manière dont je vois la chose, je me dis que ça fait un peu colonne morte qui sert essentiellement à simplifier la requête. Un artifice SQL donc, sauf si cette colonne contient des valeurs bien définie.
Plantouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h13.


 
 
 
 
Partenaires

Hébergement Web