Page 1 sur 1

"Select" en entonnoir ou imbriqué...

Posté : 03 juil. 2006, 16:11
par Tessai
Bonjour tout le monde,

J'ai un soucis avec une de mes requetes...

J'ai plusieur tables :

T user
-------
id_user
id_location
id_department
blabla

T location
------
id_location
blabla2

Jusque là tout va bien mais c'est la fin de journée et je commence à chauffer de trop :roll:

Donc je voudrais prendre tout ceux qui sont dans la meme location et en ressortir toutes les infos qui leur sont attachées dans ma table user.

J'ai peur de me frotter à des tableaux a 2 dimensions mais suis pas sure que ce soit nécessaire :d

Heelp ? :)

Posté : 03 juil. 2006, 16:16
par Ryle
Je suis pas bien certain de ce que tu veux faire, mais pourquoi pas faire un simple select sur ta table user en filtrant sur le id_location (WHERE id_location = xx) ? ou juste un ORDER BY si tu veux seulement les regrouper par location ?

Posté : 03 juil. 2006, 16:20
par Tessai
Ben c'est un peu le principe du "WHERE id_location = xx" mais je voudrais afficher les infos de la table user par location...

Genre :

location1:

username1
userlocation1
userblabla1

username2
userlocation2
userblabla2

location2:

username3
userlocation3
userblabla3

username4
userlocation4
userblabla4

Et ainsi de suite...

En fait je voudrais éviter de devoir faire un truc du style :
SELECT * FROM user WHERE location = $location['$i']
Et de boucler le tout pour avoir chaque location... parcequ'après je vais manger grave avec mes fetch et mes indices... :?

Posté : 03 juil. 2006, 16:34
par Ryle
Dans ce cas je te recommande l'option du order by :)

Dans ta requête, tu joints tes deux tables pour récupérer le libellé de la location :

Code : Tout sélectionner

SELECT usr.id_user, usr.id_department, usr.blabla, loc.blabla2 FROM user usr, location loc WHERE user.id_location = location.id_location
Et tu les tries selon le libelle de la location

Code : Tout sélectionner

ORDER BY loc.blabla2
Tu vas ainsi retrouver la liste de tes utilisateurs et de leur location, ordonnée par location.

Il ne te reste plus côté php, qu'à boucler normalement en stockant dans une variable temporaire le nom de la location. Ainsi, tu peux comparer le nouveau au précédent et à chaque fois qu'elle change, afficher la nouvelle :)
if($location!=$locationPrecedente) {
  echo $location; // affichage de la location
  $locationPrecedente = $location; // on met à jour le futur précédent
}

Posté : 04 juil. 2006, 11:46
par Tessai
J'y arrive pas grand chef :cry:

J'essaie de boucler mais je ne vois pas ou tu veux aller avec ton
Il ne te reste plus côté php, qu'à boucler normalement en stockant dans une variable temporaire le nom de la location. Ainsi, tu peux comparer le nouveau au précédent et à chaque fois qu'elle change, afficher la nouvelle
Tu voudrais pas détailler un peu plus s'il te plait ? :P

Posté : 04 juil. 2006, 12:31
par Ryle
Hugh ! Et bien pludétaillons dans ce cas :)

Ta requête va te retourner des enregistements de cette forme :

Code : Tout sélectionner

username1 | userlocation1 | userblabla1 | location1 username2 | userlocation2 | userblabla2 | location1 username3 | userlocation3 | userblabla3 | location2 ...
Tu vas donc pouvoir les lire et les afficher ligne par ligne avec un mysql_fetch_*. L'idée c'est de comparer à chaque ligne la valeur du champ location précédent pour savoir si l'on est toujours dans le même où s'en est un nouveau (puisque les enregistrement sont ordonnés par location grace à l'ORDER BY)
oldLocation = ""; // on définit une variable pour stocker les locations
while(...) {
  if(...) {// on compare le location de la ligne au précédent
     // si ils sont différents, on affiche la location
     // on met à jour le location précédent
  }
  // on affiche normalement la ligne
}
ce qui devrait te sortir :

Code : Tout sélectionner

location1 username1 | userlocation1 | userblabla1 username2 | userlocation2 | userblabla2 location2 username3 | userlocation3 | userblabla3 ...
C'est y plus clair ?

Posté : 04 juil. 2006, 15:14
par Tessai
Affirmatif... c'est de la bonne logique programmative ça monsieur !

J'ai encore du chemin pour affiner ma logique mais petit à petit... l'oiseau fait son nid :P

Un tout grand merci !!

Vais mettre mon code comme ça c'est mieux :P
	$Q_bydept = mysql_query("SELECT user.firstname, user.midname, user.lastname, department.dept_name FROM user, department WHERE user.id_dept = department.id_dept ORDER BY department.dept_name") or die (mysql_error());
	$dept_old = '';
	while ($from = mysql_fetch_array($Q_bydept))
	{
	
		if($from['dept_name']!=$dept_old) 
		{ 
			echo $from['dept_name'];
			echo '<br />';
			$dept_old = $from['dept_name']; // on met à jour le futur précédent 
		}
		
	echo '<div align="right">';
	echo $from['firstname'].'.'.$from['midname'].'.'.ereg_replace(' ', '', $from['lastname']).'@my-company.com';
	echo '<br />';
	echo 'my-company\\'.substr($from['firstname'].'.'.$from['midname'].'.'.ereg_replace(' ', '', $from['lastname']), 0, 20);
	echo '<br />';
	echo '</div>';
	}