[Mysql] - Structures de tables / requête complexe - enfin complexe pour moi ^^

Alors voilà, j’ai une table avec des voitures, et ensuite plusieurs tables pour gérer leurs avaries…

Sur ma future page, les véhicules sont affichés en liste, avec éventuellement leurs avaries s’il y en a. Pour l’affichage pur j’utiliserais un tool tip en dhtml qui affichera la liste des avaries, mais ca c’est du cosmétique c’est pas le problème qui nous intéresse.

Donc je disais : je sais pas comment faire ma requête pour gérer un truc pareil :confused:

Voilà ma requête actuelle, et son résultat, j’ai deux avaries pour une même voiture là… mais évidement dans mon résultat html je veux une seule ligne pour la voiture…

Voici ensuite des screens des différentes tables.

Avaries :

http://img133.imageshack.us/img133/8926/tableavaries3vr.th.jpg

Localisations :

http://img87.imageshack.us/img87/2694/tablelocalisations3po.th.jpg

Natures :

http://img149.imageshack.us/img149/2623/tablenatures8xg.th.jpg

Vehicules :

http://img139.imageshack.us/img139/1143/tablevehicules6if.th.jpg

Peut être que mes tables sont pas bien optimisées, ce qui cause mon soucis ? Ici j’ai une liste de localisations et de natures d’avaries qui sont définies dans deux tables, et une table avaries qui sauve quelle localisation et nature pour quel véhicule (et quelle importance de dégats, mais c’est secondaire).

Si qqn est inspiré… Merci par avance :slight_smile:

tu pourrais s’il te plait donner d’autres screens de tes tables parce que la je ne vois que user posted image :confused:

C’est imageshack qui doit être en carafe, ou bien bloqué depuis là où te connectes :confused:

Je vais poster un dump plus simplement… sinon cf notre topic de glande habituel où kiss a commencé à répondre :ane:

les 3 left join fonctionnent ?

Oui pas de soucis… ca affiche bien ce qu’il faut pour mon numéro de véhicule.

Mais si j’ai deux avaries pour un même véhicule évidement, ca me retourne 2 lignes avec 2 fois le même numéro de chassis

Or à l’affichage html, moi je veux un tableau avec à chaque ligne mes chassis, et sur chaque ligne la liste des avaries dans une case…

genre :

  • voiture 1 | avarie 1,avarie 2 +
  • voiture 2 | avarie 1 +
  • voiture 3 | avarie 1, avarie 2, avarie 3, …, avarie X +

Et là je sais pas quoi faire, kiss cool à proposé deux solutions, et l’une je sais pas faire, l’autre je suis pas certain de ce qu’il a voulu me dire :smiley:

Es que tu pourais envoyer tes create table, pour que je fasse des test en local ? :na:

SQL

– Structure de la table `avaries`

CREATE TABLE `avaries` (
`idAvarie` int(11) unsigned NOT NULL auto_increment,
`idVehicule` int(11) unsigned NOT NULL,
`idNature` int(11) unsigned NOT NULL default ‘1’,
`idLocalisation` int(11) unsigned NOT NULL default ‘1’,
`criticite` enum(‘Faible’,‘Moyen’,‘Fort’) NOT NULL,
PRIMARY KEY (`idAvarie`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;



– Structure de la table `localisation`

CREATE TABLE `localisation` (
`idLocalisation` int(11) NOT NULL auto_increment,
`codeLocalisation` varchar(5) NOT NULL,
`nomLocalisation` varchar(255) NOT NULL,
`positionLocation` enum(‘GAUCHE’,‘DROITE’,‘AVANT’,‘ARRIERE’,‘HAUT’,‘INTERIEUR’,‘DIVERS’) NOT NULL,
PRIMARY KEY (`idLocalisation`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=135 ;



– Structure de la table `natures`

CREATE TABLE `natures` (
`idNature` int(11) NOT NULL auto_increment,
`codeNature` varchar(5) NOT NULL,
`nomNature` varchar(255) NOT NULL,
PRIMARY KEY (`idNature`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;



– Structure de la table `vehicules`

CREATE TABLE `vehicules` (
`idVehicule` int(11) unsigned NOT NULL auto_increment,
`idLot` tinyint(4) unsigned NOT NULL default ‘0’,
`chassis` varchar(17) NOT NULL default ‘’,
`Montant` decimal(7,2) NOT NULL default ‘0.00’,
`Nature` tinyint(3) NOT NULL default ‘1’,
`Lieu` tinyint(3) NOT NULL default ‘1’,
`Avenant` varchar(10) NOT NULL default ‘’,
`Details` varchar(50) default NULL,
`MarqueurV` enum(‘Normal’,‘Anormal’,‘Annulé’) NOT NULL default ‘Normal’,
PRIMARY KEY (`idVehicule`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=764 ;

alors je viens d’y réfléchir et à moins de bricoler avec un cursor (non disponible avec mysql) ce n’est pas directement possible en une seule requête SQL.

il te faut donc faire deux requêtes sur la base de données.

edit : une technique @psgsql :

http://archives.postgresql.org/pgsql-novic…02/msg00218.php

Ah merci on dirait bien que ca colle à ce que je veux faire

Les requêtes PSG ca peut que me plaire ^^

Bon alors en revanche les array déjà que j’y capte rien en php ^^ alors rajoutés dans les requêtes SQL ils ont pas fini de me donner des maux de tête :smiley:

LOL c’est pas PSG mais PGSQL :ane:

Oui je sais, mais bon t’as fait la faute alors je profite ^^

Sinon la technique à deux requêtes ca consiste en quoi ? :smiley: Parce que ton truc PSG c’est un poil trop avancé pour mon faible skillz ^^

Les requêtes PSG? C’est des requêtes où le SGBD s’emmêle les pinceaux?

Espèce de troll va :smiley:

Toute manière PSGPHP c’est largement mieux que OMASP :ane:

bon plus sérieusement, puisque tu passes dans le coin sans-nom, tu as toute liberté pour formuler une réponse sur le sujet, même si comme d’habitude je vais rien comprendre à ta réponse :ane:

Tu vas rire? j’ai pas compris (ni lu) la question ! :slight_smile:

Si t’as pas lu, tu peux pas comprendre, c’est logique ^^

Tu devrais schématiser ta base de données sur papier :

un carré pour la table
un rond pour un attribut (ex: idArticle), et en soulignant le nom de l’attribut si c’est une clef
un losange pour une relation

Ca te permettrait de mieux préparer tes requêtes.

Maintenant, pour ton problème : tu veux toute les voitures avec avarie, mais sans prendre en compte les voitures en double? ou ?

(c’est ça que je ne pige pas)

En fait si tu te souviens des screen que j’avais posté, l’application affiche les voitures dans un tableau (html) ligne après ligne.

Une ligne = 1 véhicule.

Tous les véhicules ont des avaries (ou une seule éventuellement) sinon ils seraient pas dans mon application.

Donc maintenant que je dois gérer des avaries multiples, j’ai fait des tables en plus, avec la bénédiction de kisscool ^^

Désormais le jeu c’est d’afficher dans mon tableau mes lignes comme avant, mais en plus toutes les avaries de chaque véhicule dans une des cellule par exemple (même si en fait je vais utiliser du dhtml pour les présenter, mais peut importe la forme je dirais :slight_smile:

C’est plus clair, où faut que je fasse un dessin ?

Ah et sinon j’ai fait un dessin de mes tables, je le fais toujours car sinon j’ai du mal à représenter le merdier dans ma tête :slight_smile:

Et puis ces grandes feuilles A3 ca fait classe sur mon bureau :ane:

En gros je veux ca : (les + + sont des lignes) ==>

Je vois.

(je pige l’utilisation des tableaux)

Deux solutions :

  1. Prendre toutes les voitures, et pour chacune lister les avaries (et donc cacher celles qui n’en ont pas)

  2. Prendre toutes les avaries, et utiliser les tableaux de php pour regrouper les avaries par voitures.

Ex:

$cars = array();
while ( $avaries = ...) {
  $cars[$avaries['car_id']][] = &$avaries;
}

var_dump($cars);

La seconde est plus lourde car tu vas rechercher des informations sur les voitures même si tu les as déjà, la seconde est un peu mieux, mais pas forcément non plus.

Sinon les tableaux :slight_smile: mais j’en fais pas en SQL.