Forums Développement Multimédia

Aller au contenu

Requête Mysql : erreur de conecption

CODE PHP MySQL

12 réponses à ce sujet

#1 mattt

  • Members
  • PipPipPipPipPipPipPipPip
  • 678 messages

Posté 10 September 2008 - 07:32 AM

Bonjour à tous,

Je dois faire une erreur bebete mais n'arrive pas encore à trouver où.
J'ai une base de données avec une table "immeuble", une table "station de transport" une table "ligne de transport" et une table qui fait les jointures entre lignes et stations.
Dans ma table immeuble j'ai 3 champs de station (station1, station2 et station3) qui prennent les identifiants des stations (une table de jointure aurait été mieux mais c'est sensé fonctionner quand même).

J'ai créé 2 immeubles. L'un avec une station de la ligne 6 et un autre avec une station de la ligne 6 et une station de la ligne 8
Quand je recherche les immeubles sur la ligne 6 OU sur la ligne 8 j'obtiens bien 2 résultats
Quand je recherche les immeubles sur la ligne 6 ET sur la ligne 8 je n'obtiens rien. J'ai donc une erreur dans ma requête que voici:

SELECT DISTINCT immeuble.imm_id, immeuble.imm_id_station1, immeuble.imm_id_station2, immeuble.imm_id_station3 
FROM immeuble, station_ligne_transport sl, ligne_transport lt 
WHERE 
( 
	( 
		imm_id_station1=sl.SL_id_station 
		AND sl.SL_id_ligne=lt.ligne_id 
		AND lt.ligne_nom='8'
	) 
	OR 
	( 
		imm_id_station2=sl.SL_id_station 
		AND sl.SL_id_ligne=lt.ligne_id 
		AND lt.ligne_nom='8' 			
	) 
	OR 
	( 
		imm_id_station3=sl.SL_id_station 
		AND sl.SL_id_ligne=lt.ligne_id 
		AND lt.ligne_nom='8' 			
	) 
) 
AND // correspond au ET et ne fonctionne pas, le OR fonctionne
( 
	( 
		imm_id_station1=sl.SL_id_station 
		AND sl.SL_id_ligne=lt.ligne_id 
		AND lt.ligne_nom='M6' 
	) 
	OR 
	( 
		imm_id_station2=sl.SL_id_station 
		AND sl.SL_id_ligne=lt.ligne_id 
		AND lt.ligne_nom='M6' 
	) 
	OR 
	( 
		imm_id_station3=sl.SL_id_station 
		AND sl.SL_id_ligne=lt.ligne_id 
		AND lt.ligne_nom='M6' 
	) 
)

Merci pour votre aide et bonne journée

#2 Antoine

    Membre

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 9152 messages

Posté 10 September 2008 - 10:22 AM

Change ta structure pour une table de jointure entre les immeubles et les stations, ce sera plus simple et plus propre... là, c'est fort cracra :)

#3 mattt

  • Members
  • PipPipPipPipPipPipPipPip
  • 678 messages

Posté 10 September 2008 - 10:38 AM

huuum mes réponses rapides ne passent pas !
Donc je disais qu'effectivement ce serait plus propre. Cependant j'aimerai bien comprendre la raison pour laquelle ça ne fonctionne pas tel quel.

Merci à tous

#4 Antoine

    Membre

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 9152 messages

Posté 10 September 2008 - 11:11 AM

Il est assez étrange que tes lignes ne suivent pas la même nomenclature (8, M6) Il faudrait que l'on puisse voir la table des immeubles pour être sur de comprendre (tu peux poster un dump)

Le pourquoi cela ne fonctionne pas, je t'avoue que je ne sais pas. La requête est fort compliquée pour ce que tu veux faire. Avec une table de jointure, la requete tiens en une ligne.

#5 mattt

  • Members
  • PipPipPipPipPipPipPipPip
  • 678 messages

Posté 10 September 2008 - 11:25 AM

OUi oui en effet
Au final tout s'appellera M + le num de la ligne
la j'avais modifié le nom pour tester.

Citation

CREATE TABLE `immeuble` (
`imm_id` smallint(5) unsigned NOT NULL auto_increment,
`imm_nom` varchar(45) default NULL,
`imm_id_station1` smallint(5) unsigned default NULL,
`imm_id_station2` smallint(5) unsigned default NULL,
`imm_id_station3` smallint(5) unsigned default NULL,
PRIMARY KEY (`imm_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Contenu de la table `immeuble`
--

INSERT INTO `immeuble` (`imm_id`, `imm_nom`, `imm_id_station1`, `imm_id_station2`, `imm_id_station3`) VALUES
(1, 'Le Saxe', 396, 601, 0),
(2, 'Le Saxe2', 403, 0, 0);


CREATE TABLE `ligne_transport` (
`ligne_id` smallint(5) unsigned NOT NULL auto_increment,
`ligne_nom` varchar(255) default NULL,
PRIMARY KEY (`ligne_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=26 ;


INSERT INTO `ligne_transport` (`ligne_id`, `ligne_nom`) VALUES
(1, '1'),
(2, '2'),
(3, '3'),
(4, '3bis'),
(5, '4'),
(6, '5'),
(7, 'M6'),
(8, '7'),
(9, '7bis'),
(10, '8'),
(11, '9'),
(12, '10'),
(13, '11'),
(14, '12'),
(15, 'M13'),
(16, '14');

CREATE TABLE `station_transport` (
`station_id` smallint(5) unsigned NOT NULL auto_increment,
`station_nom` varchar(255) default NULL,
PRIMARY KEY (`station_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=627 ;

INSERT INTO `station_transport` (`station_id`, `station_nom`) VALUES
(396, NULL, 'Créteil-Préfecture (Hôtel de Ville)', NULL, NULL),
(403, NULL, 'Dugommier', NULL, NULL),
(601, NULL, 'Sèvres - Lecourbe', NULL, NULL);

CREATE TABLE `station_ligne_transport` (
`SL_id_ligne` smallint(5) unsigned NOT NULL default '0',
`SL_id_station` smallint(5) unsigned NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `station_ligne_transport` (`SL_id_ligne`, `SL_id_station`) VALUES
(10, 396),
(7, 403),
(7, 601);

je suis entrain de faire la table de jointure mais je vais quand même essayer de comprendr epourquoi cette requête ne fonctionne pas. Il doit y avoir une raison simple !

Merci à toi

#6 Antoine

    Membre

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 9152 messages

Posté 10 September 2008 - 11:34 AM

Avec un peu d'algèbre relationnelle et de logique, on peut simplifier (ou mettre sous une autre forme) ta requête. On a alors:
SELECT DISTINCT immeuble.imm_id, immeuble.imm_id_station1, immeuble.imm_id_station2, immeuble.imm_id_station3  FROM immeuble, station_ligne_transport sl, ligne_transport lt  WHERE  sl.SL_id_ligne=lt.ligne_id  AND
(imm_id_station1=sl.SL_id_station OR imm_id_station2=sl.SL_id_station OR  imm_id_station3=sl.SL_id_station)  AND lt.ligne_nom='8'
AND lt.ligne_nom='M6'

Il devient alors assez logique de comprendre pourquoi cela ne marche pas :texas:

#7 mattt

  • Members
  • PipPipPipPipPipPipPipPip
  • 678 messages

Posté 10 September 2008 - 11:43 AM

Oui effectivement.

Merci bien, je refait tout ça.

Bonne journée

#8 mattt

  • Members
  • PipPipPipPipPipPipPipPip
  • 678 messages

Posté 10 September 2008 - 13:17 PM

Bon et bien effectivement et en toute logique ça fonctionne beaucoup mieux avec la table de jointure.
Toutefois je suis sceptique, il doit bien exister une méthode pour obtenir le résultat souhaité avec la première méthode (crade) ?

J'aime bien comprendre les choses donc je vais essayer d'y parvenir, vu l'erreur sur laquelle tu as mis le doigt je suppose que la solution doit être simpliste.

Merci encore

#9 Antoine

    Membre

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 9152 messages

Posté 10 September 2008 - 13:59 PM

En fait, oui, la solution est assez simple mais loin d'être jolie.

Le principe sera le suivant (la requete ne marchera probablement pas :texas:)
SELECT DISTINCT immeuble.* 
FROM immeuble, station_ligne_transport sl, station_ligne_transport sl2, ligne_transport lt , ligne_transport lt2 
WHERE sl.SL_id_ligne=lt.ligne_id AND sl2.SL_id_ligne=lt2.ligne_id AND sl2.SL_id_station=sl.SL_id_station AND (imm_id_station1=sl.SL_id_station OR imm_id_station2=sl.SL_id_station OR imm_id_station3=sl.SL_id_station) AND (imm_id_station1=sl2.SL_id_station OR imm_id_station2=sl2.SL_id_station OR imm_id_station3=sl2.SL_id_station) AND lt.ligne_nom='8' AND lt2.ligne_nom='M6'


#10 mattt

  • Members
  • PipPipPipPipPipPipPipPip
  • 678 messages

Posté 10 September 2008 - 14:08 PM

olalalaaaa oui ok j'ai compris.
je me mets un blam pour ces atrocités. :texas:

et encore un merci, ça ne mange pas de pain.
Bye

#11 Antoine

    Membre

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 9152 messages

Posté 10 September 2008 - 14:10 PM

De rien, ça ne me prends pas beaucoup de temps et c'est relativement facile pour moi :texas: (en tout cas à coté des horribles requêtes que j'ai du écrire lors de mes cours) alors autant aider, si ça peut servir

#12 mattt

  • Members
  • PipPipPipPipPipPipPipPip
  • 678 messages

Posté 16 September 2008 - 11:55 AM

Hello,

Bon j'ai tout modifié et ça fonctionne très bien maintenant.
Toutefois ne voulant pas lâcher la grappe j'ai essayé avec la méthode crade.
Sur mon serveur interne j'obtiens le résultat assez rapidement.
Sur le serveur distant la requête plante.

La base de données est identique, j'ai fait un clône juste avant de tester.
La version de mysql diffère, 4.1.11 sur le distant contre 5.0.45 en interne.
Est ce que cela peut etre la cause du problème ??

pourquoi une même requête fonctionne sur un serveur et pas sur un autre?

merci à tous et bonne journée

#13 Ldo

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 9921 messages

Posté 16 September 2008 - 13:06 PM

Voir le messagemattt, le Sep 16 2008, 12:55 PM, dit :

pourquoi une même requête fonctionne sur un serveur et pas sur un autre?

tu donne la réponse toi même ...
version de mysql 4 et 5



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP