affichage d'éléments n'ont présents dans la BdD principale

Eléphant du PHP | 289 Messages

14 nov. 2005, 11:17

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
je dois être la seule souris au monde qui ne fait pas peur aux néléphants ! :=)

Invité
Invité n'ayant pas de compte PHPfrance

14 nov. 2005, 11:46

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

Eléphant du PHP | 289 Messages

14 nov. 2005, 12:15

salut,

Oui oui oui, tu as raison, je me suis trompé de terme! :oops:

il s'agit bien de 2 différentes tables dans la meme BdD!!
je dois être la seule souris au monde qui ne fait pas peur aux néléphants ! :=)

Eléphant du PHP | 153 Messages

14 nov. 2005, 15:04

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

ViPHP
pjl
ViPHP | 2119 Messages

14 nov. 2005, 15:50

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

Eléphant du PHP | 153 Messages

14 nov. 2005, 16:04

Pourquoi le select * n'est il pas une bonne méthode pjl?

ViPHP
pjl
ViPHP | 2119 Messages

14 nov. 2005, 16:25

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.

Eléphant du PHP | 289 Messages

15 nov. 2005, 08:38

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
je dois être la seule souris au monde qui ne fait pas peur aux néléphants ! :=)

Mammouth du PHP | 19672 Messages

15 nov. 2005, 09:38

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"
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 289 Messages

15 nov. 2005, 10:10

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 :oops:

Tu vois d'ou ca peut venir?
FAb

PS: je l'ai tester sous myadmin et aucun message d'erreur
je dois être la seule souris au monde qui ne fait pas peur aux néléphants ! :=)

Eléphant du PHP | 219 Messages

15 nov. 2005, 13:55

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)

Eléphant du PHP | 289 Messages

16 nov. 2005, 09:04

Ben, malgré ton lien, c pas ce que je désire :oops:

Je vais compléter l'exemple de mon premier post, pê que ca vous aidera a mieux cerner le but a atteindre :lol:

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 :wink:

FAb
je dois être la seule souris au monde qui ne fait pas peur aux néléphants ! :=)

Mammouth du PHP | 19672 Messages

16 nov. 2005, 10:03

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

16 nov. 2005, 10:29

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)
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 219 Messages

16 nov. 2005, 11:38

si je meurs aujourd'hui, je mourrais moins con. Merci Cyrano ;)