aide sur une requete

Eléphant du PHP | 288 Messages

12 août 2008, 18:22

Bonjour,

Je dois effectuer sur une requete sur deux tables. Une contient des marques de voiture(exemple: acura, BMW etc..) et l'autre table contient les modeles de voiture (exemple: pour acura, j ai mdx, rdx, pour BMW, j'ai m5, m3). J'aimerais effectuer un SELECT sur les deux tables et avoir une reponse du genre:

Code : Tout sélectionner

Acura->MDX,RDX; BMW ->M5,M3;
Je ne veux pas avoir de redondance dans les marques. Actuellement avec ma requete, j'ai une reponse du genre :

Code : Tout sélectionner

Acura->MDX,Acura->RDX BMW->M5, BMW->M3;
Voici ma requete

J'espere que je suis assez clair, merci d'avance.

Code : Tout sélectionner

$sql = "SELECT mark.`idMark` as `mark idMark`, mark.`make` as `mark make`, model.`idModel` as `model idModel`,model.`model` as `model model`, model.`desc` as `model desc`,model.`price` as `model price`, model.`year` as `model year`,model.`warranty` as `model warranty`, model.`pic` as `model pic` FROM `mark`,`model` WHERE mark.`idMark` = model.`idMark`";

Code : Tout sélectionner

CREATE TABLE `mark` ( `idMark` tinyint(4) NOT NULL auto_increment, `make` varchar(20) collate latin1_general_ci NOT NULL, PRIMARY KEY (`idMark`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=5 ; CREATE TABLE `model` ( `idModel` tinyint(4) NOT NULL auto_increment, `idMark` tinyint(4) NOT NULL, `model` varchar(20) collate latin1_general_ci NOT NULL, `desc` varchar(150) collate latin1_general_ci NOT NULL, `price` float NOT NULL, `year` tinyint(4) NOT NULL, `warranty` tinyint(4) NOT NULL, `pic` varchar(255) collate latin1_general_ci NOT NULL, PRIMARY KEY (`idModel`), KEY `idMark` (`idMark`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=9 ;

ViPHP
ViPHP | 5924 Messages

12 août 2008, 18:36

Alors, tu peux regarder du côté de GROUP BY et de GROUP_CONCAT(). En fait, l'idée serait de grouper par marque, et ensuite d'utiliser GROUP_CONCAT pour concaténer la colonne modèle de voiture, et ainsi obtenir une liste de modèles pour chaque marque…

Eléphant du PHP | 288 Messages

12 août 2008, 19:46

Merci beaucoup sékiltoyai,

j'ai changé ma requete et là j'ai plus de redondance. Par contre j'ai un problème qui apparait. Je dois construire un xml qui ressemble à:

Code : Tout sélectionner

<records> <record><data semantic_name="mark idMark" value="1" flag="primary_key" /> <data semantic_name="mark make" value="Acura" flag="normal" /> <data semantic_name="model idModel" value="1" flag="primary_key" /> <data semantic_name="model model" value="MDXxxx" flag="normal" /> <data semantic_name="model desc" value="One of the nicest car" flag="normal" /> <data semantic_name="model price" value="300000" flag="normal" /> <data semantic_name="model year" value="127" flag="normal" /> <data semantic_name="model warranty" value="6" flag="normal" /> <data semantic_name="model pic" value="http://server.com/server/img/acuramdx.jpg" flag="normal" /> </record> <record> <data semantic_name="mark idMark" value="1" flag="primary_key" /> <data semantic_name="mark make" value="Acura" flag="normal" /> <data semantic_name="model idModel" value="2" flag="primary_key" /> <data semantic_name="model model" value="RDX" flag="normal" /> <data semantic_name="model desc" value="The second of the nicest car done by Acura" flag="normal" /> <data semantic_name="model price" value="20000" flag="normal" /> <data semantic_name="model year" value="127" flag="normal" /> <data semantic_name="model warranty" value="3" flag="normal" /> <data semantic_name="model pic" value="http://server.com/server/img/2007_acura_rdx.jpg" flag="normal" /> </record> </records>
semantic_name nous donne le nom de la table et la colonne,
value, la valeur de la requete,
flag me laisse savoir si le champ est une clé primaire ou pas.

Avant je change ma requete tout était ok. Maintenant je blogue au niveau de la récupération des métadonnées.

je poste le bout de code concerné.

$sql = "SELECT mark.`idMark` AS `mark idMark` , mark.`make` AS `mark make` , GROUP_CONCAT( model.`idModel` ) AS `model idModel` , GROUP_CONCAT( model.`model` ) AS `model model` , GROUP_CONCAT( model.`desc` ) AS `model desc` , GROUP_CONCAT( model.`price` ) AS `model price` , GROUP_CONCAT( model.`year` ) AS `model year` , GROUP_CONCAT( model.`warranty` ) AS `model warranty` , GROUP_CONCAT( model.`pic` ) AS 		`model pic` FROM `mark` , `model` WHERE mark.`idMark` = model.`idMark` GROUP BY mark.`idMark`";
						if($stmt->prepare($sql))
						{
							//echo "*****";
							$stmt->bind_result($v1,$v2,$v3,$v4,$v5,$v6,$v7,$v8,$v9);
							$stmt->execute();
							
							/*construction of the metadata array*/
							$result = $stmt->result_metadata();
							while($field = $result->fetch_field())
							{
								//var_dump($field);
								$tmp = $field->name."@$".$field->flags; //marche plus
								array_push($tabMeta,$tmp);
							
							}
							var_dump($tabMeta);
							/*construction of the result set*/
							while($stmt->fetch())
							{
								/* @$separate the value with the field name and his flag ; # start another colonne*/
								$tmp = $v1."@$".$tabMeta[0]."#".$v2."@$".$tabMeta[1]."#".$v3."@$".$tabMeta[2]."#".$v4."@$".$tabMeta[3]."#".$v5."@$".$tabMeta[4]."#".$v6."@$".$tabMeta[5]."#".$v7."@$".$tabMeta[6]."#".$v8."@$".$tabMeta[7]."#".$v9."@$".$tabMeta[8];
								array_push($tabResu,$tmp);
							}

Toute suggestion est bienvenue.

Merci d'avance