Bonjour,

Voila j'ai un probleme qui vous semblera surement idiot mais il me bloque enormement. le probleme est le suivant. j'ai une BDD avec 2 tables (contacts et phones) qui est sous cette forme :
(table phones)
id contactId type number
1 1 cell 0600000000
2 3 home 0100000000
3 4 cell 0600000000
4 1 home 0100000000
5 3 cell 0600000000
6 3 work 0100000000
7 2 cell 0600000000
8 4 home 0100000000

(table contacts)
id firstName lastName birthday
1 jean GABIN 1985-10-13
2 marta DUPONT 1987-07-10
3 jerome DUBOIS 1986-12-12
4 matilde DUPONT 1973-04-20

je souhaiterai qu'apres avoir fait ma requette SQL (SELECT * FROM contacts c, phones p WHERE c.id=p.contactId) cela m'affiche un tableau du type :

| NOM | PRENOM | ANNIVERSAIRE | TELEPHONE |
| GABIN | jean | 1985-10-13 | 0600000000 (cell) |
| | 0100000000 (home) |
-------------------------------------------------------------------------
| DUPONT | marta | 1987-07-10 | 0600000000 (cell) |
-------------------------------------------------------------------------
| DUBOIS | jerome | 1986-12-12 | 0600000000 (cell) |
| | 0100000000 (home) |
| | 0100000000 (work) |

j'arrive a former le tableau mais il apparait sous cette forme:

| NOM | PRENOM | ANNIVERSAIRE | TELEPHONE |
| GABIN | jean | 1985-10-13 | 0600000000 (cell) |
| GABIN | jean | 1985-10-13 || 0100000000 (home) |
-------------------------------------------------------------------------
| DUPONT | marta | 1987-07-10 | 0600000000 (cell) |
-------------------------------------------------------------------------
| DUBOIS | jerome | 1986-12-12 | 0600000000 (cell) |
| DUBOIS | jerome | 1986-12-12 | 0100000000 (home) |
| DUBOIS | jerome | 1986-12-12 | 0100000000 (work) |

voici mon script PHP:

<?php

	require_once("mainlib.php");
	
	get_db();
	
	$req = "SELECT *
			FROM contacts c, phones p
			WHERE c.id=p.contactId
			";
			
	$res = mysql_query($req);
?>


<table border="0" cellspacing="1" bgcolor="#000000" align="center" width="50%">
		<tr bgcolor="#FFFFFF">
			<td>
				Firstname
			</td>
			<td>
				Lastname
			</td>
			<td>
				Birthday
			</td>
			<td>
				Phone
			</td>
		</tr>


<?php	
	while ($tab = mysql_fetch_assoc($res)) {
		
		echo "<tr bgcolor='#FFFFFF'>";
			echo "<td>";
				echo $tab["firstName"];
			echo "</td>";
			echo "<td>";
				echo $tab["lastName"];
			echo "</td>";
			echo "<td>";
				echo $tab["birthday"];
			echo "</td>";
			echo "<td>";
				echo $tab["number"]."&nbsp;(".$tab["type"].")";
			echo "</td>";
		echo "</tr>";
	}

?>

</table>


Merci d'avance pour votre aide.
Alors là c'est une des choses les plus compliquées à faire en sql mais c'est faisable , je te conseille de faire des vues pour chaque type de téléphone , un peu fatiguée pour t'expliquer mais le secret est de considérer chaque sous ensemble de la table phone comme une table différente et de faire des jointures entre elles ...

bref voilà un code sql qui marche :
SELECT `c1` . * , `phone_home`.`numero` AS home, `phone_work`.`numero` AS
WORK , `Phone_cell`.`numero` AS cell
FROM contacts c1
LEFT JOIN (
phone_home
LEFT JOIN (
phone_work
LEFT JOIN Phone_cell ON phone_work.id_contact = Phone_cell.id_contact
) ON phone_home.id_contact = phone_work.id_contact
) ON c1.id = phone_home.id_contact
LIMIT 0 , 30


Pour me faciliter la vie j'ai créé les vues Phone_cell , Phone_work et phone_home ce qui évite de se trimballer les clauses where et facilite l'écriture de la requête principale

Résultat :

id 	Nom   	Prenom 	Anniversaire 	home 	work  	cell
1 	Marchand 	Antoine 	1986-10-22 	100101001 	100101001 	NULL
2 	Bobo 	        Gustave 	1969-12-03 	100401001 	100401001 	100401051
Merci pour ta réponse Arialia.

Le seul probleme c'est qu'en fait je ne dois pas modifier la structure de la base de donnée. C'est un exercice qui m'a été donné en cours et je dois trouver le code PHP et SQL me permettant de donner le resultat souhaité...
Ah ah Smiley biggrin

Alors je vais te laisser mariner un peu ....

tout ce que tu as à faire c'est remplacer le nom des vues par
a écrit :
phone as phone_work
phone as phone_home
phone as phone_cell

dans les jointures et ajouter les conditions des vues à la clause where

hum au fait le left join n'est pas forcément le plus approprié entre les tables phone ... je te laisse trouver la bonne jointure ( pense au cas du téléphone unique de type 'cell' ... )

PS : ceci dit l'inconvénient de cette méthode est que cela ne prendra pas en compte de nouveaux types de téléphones ... à terme la récupération du contact puis de ses téléphones ( boucle sur les téléphones) et formatage par php serait mieux.
Modifié par Arialia (26 May 2011 - 13:07)
a écrit :
à terme la récupération du contact puis de ses téléphones ( boucle sur les téléphones) et formatage par php serait mieux.


c'est effectivement ce que je souhaiterai faire mais je ne vois pas du tout comment le faire. Je te remercie en tout cas