Page 1 sur 2
affichage d'éléments n'ont présents dans la BdD principale
Posté : 14 nov. 2005, 11:17
par FAbrice
bonjour,
Est ce qu'il est possible d'afficher tous les elements lors d'une requete?
Je m'explique:
prenons le cas suivant
base de données n°1
id---elements
1--------a
2--------b
3--------c
4--------d
...
base de données n°2:
elements --- valeurs
1-----------------2
3-----------------7
3-----------------5
4-----------------7
1-----------------6
1-----------------4
4-----------------7
Dans ce cas la, on voit que l'élément B (id=2) n'est pas présent dans la BdD n°2.
il n'apparaitra donc pas lors de ma requete sur la BdD n°2.
comment est ce que je peux faire pour afficher tous elements, meme ceux qui n'ont pas de valeurs?
merci de votre aide,
FAb
Posté : 14 nov. 2005, 11:46
par Invité
Tu parles de base de données différentes ou de tables?
Si tu parles de bases de données je pense que ta conception n'est pas bonne
Posté : 14 nov. 2005, 12:15
par FAbrice
salut,
Oui oui oui, tu as raison, je me suis trompé de terme!
il s'agit bien de 2 différentes tables dans la meme BdD!!
Posté : 14 nov. 2005, 15:04
par pitt
avec deux requetes
$req1="select * from table1";
$res1=mysql_query($req1);
while ($t1=mysql_fetch_row($res1)){
//affichage éléments
echo $t1[1]
$req2="select * from table2 where id='$t1[0]'";
$res2=mysql_query($res2);
//si résultats affichage
while ($t2=mysql_fetch_row($res2)){
echo $t2[1];
}
}
Normalement ca passe
Posté : 14 nov. 2005, 15:50
par pjl
Pour pitt, le SELECT * est une mauvaise habitude à proscrire.
Pour FAbrice, avec une jointure externe, ca devrait marcher.
Du style :
Code : Tout sélectionner
SELECT tab2.valeur
FROM table2 AS tab2
LEFT JOIN table1 AS tab1
ON tab2.index = tab1.index
WHERE tab1.index IS NULL
Posté : 14 nov. 2005, 16:04
par pitt
Pourquoi le select * n'est il pas une bonne méthode pjl?
Posté : 14 nov. 2005, 16:25
par pjl
ca fait je ne sais combien de fois que l'on en parle. Une petite recherche sur le forum ou le net devrait te donner la réponse.
Posté : 15 nov. 2005, 08:38
par FAbrice
bonjour,
je viens de regarder la requete que tu me proposes pjl mais je ne vois pas comment l'adapter a ma synthaxe actuelle:
Code : Tout sélectionner
SELECT elements.Details as toto, defaut.Description as tata ,count(*) as titi
FROM expertise, elements, defaut
WHERE expertise.Element=elements.ID and expertise.Defaut=defaut.ID and expertise.Defaut>1 and defaut.id=2
GROUP BY expertise.Element, expertise.Defaut
ORDER BY toto DESC
Dans ce cas, je compte combien d'enregistrement g par element avec le defaut dont l'id=1.
si il n'y a pas d'enregistrement pour un element, il n'apparait pas dans ma liste.
est ce que vous pourriez m'aider sur ce coups la?
Merci de votre aide,
FAb
Posté : 15 nov. 2005, 09:38
par Cyrano
Sauf erreur de ma part, ta requête devrait ressembler à ceci :
Code : Tout sélectionner
SELECT elements.Details as toto, defaut.Description as tata ,count(*) as titi
FROM expertise
LEFT OUTER JOIN elements ON expertise.Element = elements.ID
LEFT OUTER JOIN defaut ON expertise.Defaut = defaut.ID
WHERE expertise.Defaut > 1
AND defaut.id = 2
GROUP BY expertise.Element, expertise.Defaut
ORDER BY toto DESC
Les colonnes où tu n'as pas de valeur contiendront "NULL" et tu auras toutes les lignes.
À tester
Note, ce n'est pas du PHP mais du SQL, je déménage sujet vers le forum "Bases de données"
Posté : 15 nov. 2005, 10:10
par FAbrice
salut Cyrano,
je viens d'essayer ta requete.
deux choses:
la premiere, c qe ca ne plante pas et que ca me renvoie les meme donnéess qu'avec la mienne.
la seconde, un peu moins bonne, c que les elements sans valeurs n'apparaissent pas
Tu vois d'ou ca peut venir?
FAb
PS: je l'ai tester sous myadmin et aucun message d'erreur
Posté : 15 nov. 2005, 13:55
par daoud
Pour moi, le problème qu tu poses est le même que
ici
En effet, comment veux-tu récupérer des enregistrements qui n'existent pas.... A mon avis tu dois utiliser la solution de l'UNION proposée dans le post que je t'indique. (la solution de la jointure gauche fonctionnerait si les enregistrements existaient avec une valeur null correspondante)
Posté : 16 nov. 2005, 09:04
par FAbrice
Ben, malgré ton lien, c pas ce que je désire
Je vais compléter l'exemple de mon premier post, pê que ca vous aidera a mieux cerner le but a atteindre
table n°1
id---elements
1--------a
2--------b
3--------c
4--------d
...
table n°2:
id---elements --- valeurs
1--------1-------------2
2--------3-------------7
3--------3-------------5
4--------4-------------7
5--------1-------------6
6--------1-------------4
7--------4-------------7
But est d'obtenir un tableau comme le suivant:
elements --- nombre de valeurs
---a-------------3
---b-------------0
---c-------------2
---d-------------2
Voila, j'espère que cet exemple va permettre de progresser
FAb
Posté : 16 nov. 2005, 10:03
par Cyrano
Bon, j'ai fait un petit test. J'ai créé deux tables, table_1 et table_2 comme ceci:
Code : Tout sélectionner
table_1
+--------+-------------+
| tb1_id | tb1_element |
+--------+-------------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+--------+-------------+
table_2
+--------+--------+-------------+
| tb2_id | tb1_id | tb2_valeurs |
+--------+--------+-------------+
| 1 | 1 | 2 |
| 2 | 3 | 7 |
| 3 | 3 | 5 |
| 4 | 4 | 7 |
| 5 | 1 | 6 |
| 6 | 1 | 4 |
| 7 | 4 | 7 |
+--------+--------+-------------+
Ensuite, j'ai fait la requête suivante, je te laisse voir le résultat obtenu toi-même:
Code : Tout sélectionner
mysql> SELECT t1.tb1_element AS 'Eléments', COUNT(tb2_valeurs) AS 'nombre de valeurs'
-> FROM table_1 AS t1 LEFT JOIN table_2 AS t2
-> ON t2.tb1_id = t1.tb1_id
-> GROUP BY t1.tb1_element;
+----------+-------------------+
| Eléments | nombre de valeurs |
+----------+-------------------+
| a | 3 |
| b | 0 |
| c | 2 |
| d | 2 |
+----------+-------------------+
Le LEFT JOIN permet d'afficher tout, y compris les lignes qui n'ont pas de correspondance dans la clause de jointure.
Posté : 16 nov. 2005, 10:29
par sadeq
Remarque :
Pour réussir la jointure à gauche il faut que l'ordre des tables dans le FROM soit bien choisi.
La table qui contient les élèments à forcer l'inclusion doit se situer à gauche de celle qui peut contenir des références nulles.
C'est pourquoi la requête de Cyrano marche bien alors que ta requête ne marche pas.
Une jointure à gauche entre 2 tables A et B veut dire : inclure tous les enregistrements de A et seulement ceux de B pour lesquels les champs joints sont égaux.
Si on inverse l'ordre dans le FROM entre A et B les résultats ne seront pas les mêmes dans le cadre d'une jointure à gauche ou à droite d'ailleurs.
Je crois que c'est logique tout ça.
Une autre remarque trés importante:
Quand la jointure à gauche ou à droite implique plusieurs tables, il faut faire trés attention car tantque le nombre de tables augmente, le multiplexage entre les occurences des tables augmente.
Exemple :
Code : Tout sélectionner
T1 T2 T3
-----------------------------
A -------> B ---------> C
B ---------> D
A -------> E
ici : A va apparaitre 3 fois avec une jointure à gauche entre (T1 et T2) et (T2 et T3)
Posté : 16 nov. 2005, 11:38
par daoud
si je meurs aujourd'hui, je mourrais moins con. Merci Cyrano
