8721 sujets

Développement web côté serveur, CMS

Salut à tous,
petit soucis pour lister une bdd dans l'ordre que je veux, j'explique

j'ai une requête qui me récupère des id dans une bdd programme
ensuite j'ai une autre requete qui utilise c'est id pour construire un tableau.

le probleme c'est que, commela second requete et dans la premiere boucle cela me creer le tableau
id par id et je ne peux pas le "ORDER BY" comme je veux.

Avec le code cela sera peut être plus compréhensible


/*requet de recup des ID dans Programme*/
...
$ret27 = mysql_query($requete27);
	while($data27 = mysql_fetch_array($ret27)) 	
	{	
	$progid27=$data27['id'];
		
	$requete28 = "SELECT * FROM logement WHERE programme_ID=$progid27 ORDER BY type DESC"; 
	$ret28 = mysql_query($requete28);
	while($data28 = mysql_fetch_array($ret28)) 	
	{
	/* création du tableau ICI */
	}
	}


Voila j’espère que c'est plus clair avec le code.

Merci d'avance de votre aide.
Modifié par spawns (23 Oct 2013 - 11:24)
Commence déjà par changer tous ces mysql_ par des mysqli_...

On rappelle que l'extension mysql_ est dépréciée depuis un certain temps et obsolète depuis php 5.5. (et donc vouée à disparaître dans PHP 6)


Sinon, tu cherches à order by quoi exactement ? Et pourquoi ça marche pas ? (enfin plutôt qu'est-ce qui marche pas ?)
Salut,

A vrai dire, je ne suis pas certain d'avoir compris à 100%. Cependant, si je comprends bien, tu voudrais avoir tous les logements dont les ID sont retournés par la requête 27, mais classés par type et non pas par ID puis par type. Si c'est bien ça, je te suggère de tout faire avec une seule requête que voici :

SELECT * FROM logement
WHERE programme_ID IN (SELECT ... ta fameuse requête 27... )
ORDER BY type DESC


Bien que ça fasse débat sur un autre sujet du forum, je trouve que c'est une bonne pratique de confier le max de boulot au SGBD.
Lothindil a écrit :
Commence déjà par changer tous ces mysql_ par des mysqli_...
On rappelle que l'extension mysql_ est dépréciée depuis un certain temps et obsolète depuis php 5.5. (et donc vouée à disparaître dans PHP 6)


Lol, on se croise encore sur une question SQL Smiley smile Je vois que la militante mysqli veille au grain !
Modifié par petibato (23 Oct 2013 - 11:58)
petibato a écrit :
Salut,

A vrai dire, je ne suis pas certain d'avoir compris à 100%. Cependant, si je comprends bien, tu voudrais avoir tous les logements dont les ID sont retournés par la requête 27, mais classés par type et non pas par ID puis par type. Si c'est bien ça, je te suggère de tout faire avec une seule requête que voici :

SELECT * FROM logement
WHERE programme_ID IN (SELECT ... ta fameuse requête 27... )
ORDER BY type DESC


Bien que ça fasse débat sur un autre sujet du forum, je trouve que c'est une bonne pratique de confier le max de boulot au SGBD.


Faire tous ça dans un requête ça me parait compliqué, mais c'est effectivement ce que je cherche, j'ai essayé mais cela ne fonctionne pas.
voici le code entier de la requête :


 $requete27 ="SELECT p.id,d.userID FROM  programme p	INNER JOIN droit d ON p.id = d.programmeID WHERE d.userID ='$_SESSION[id]' GROUP BY p.id ORDER BY p.id DESC";
$ret27 = mysql_query($requete27);
while($data27 = mysql_fetch_array($ret27)) 	
		{	
	$progid27=$data27['id'];
$requete28 = "SELECT * FROM logement WHERE programme_ID=$progid27 ORDER BY type DESC"; 
	$ret28 = mysql_query($requete28);
	while($data28 = mysql_fetch_array($ret28))
{
	/* création du tableau ICI */
	}
	}


j'ai essayé ca mais cela n'affiche rien


$requete28="SELECT * FROM logement WHERE programme_ID IN (SELECT p.id,d.userID FROM  programme p
INNER JOIN droit d ON p.id = d.programmeID WHERE d.userID ='$_SESSION[id]' GROUP BY p.id ORDER BY p.id DESC)
ORDER BY type DESC";

Modifié par spawns (23 Oct 2013 - 12:13)
$requete28="SELECT * FROM logement WHERE programme_ID IN (SELECT p.id,d.userID FROM  programme p
INNER JOIN droit d ON p.id = d.programmeID WHERE d.userID ='$_SESSION Smiley id ' GROUP BY p.id ORDER BY p.id DESC)
ORDER BY type DESC";


C'est parce que le SELECT de ta requête imbriquée contient deux champs, et c'est le champ d.userID qui est en trop. De plus, ni le GROUP BY ni le ORDER BY n'ont d'intérêt dans ta requête imbriquée, tu peux les virer !
Modifié par petibato (23 Oct 2013 - 12:21)
désolé mais cela ne fonctionne pas.
cela ne m'affiche aucun résultat ....

par contre j'ai besoin de d.userID pour ma requete
Modifié par spawns (23 Oct 2013 - 12:39)
T'as besoin de d.userID dans le SELECT ? Pour quoi faire ? A priori, tu connais sa valeur puisque dans le WHERE tu le contrains à valoir $_SESSION[$id]...

SELECT *
FROM logement 
WHERE programme_ID IN
    (SELECT p.id
     FROM  programme p INNER JOIN droit d ON p.id = d.programmeID
     WHERE d.userID ='$_SESSION[$id]')
ORDER BY type DESC


Ça ne marche pas ? T'es sûr que ya pas un souci dans un nom de champ ?
non ça marche pas cela ne m'affiche rien.
voici mes bdd
droit :
id | programmeID | userID
logement :
id | programme_ID | promoteur | ville | residence | lot | type ....
programme :
id | promoteur | nom | synthese | description ...
user :
id | Login | mail | pass ...
Merci pour ton schéma relationnel.

J'ai fait le test sur mon phpmyadmin, et ça fonctionne :

upload/51384-phpmyadmin.png

Je suppute donc que le problème ne vient pas de la syntaxe SQL...
OK ça marche, effectivement c'est moi qui étais a la rue, j’étais tellement concentré sur la requête que j'avais oublié le while...
le débile de base.

Par contre sur un autre forum on me conseillé de "Fais une jointure avec logement directement dans ta première requête"
du style
SELECT p.id, l.type, p.meschamps, l.mesautreschamps, ,d.userID FROM  programme p    
INNER JOIN 
   droit d ON p.id = d.programmeID 
INNNER JOIN 
   logement l ON l.programme_ID=p.id
WHERE 
  d.userID ='$_SESSION [id] ' GROUP BY p.id 
ORDER BY p.id, p.type DESC


Tu en penses quoi ?
vaut mieux rester sur ta solution ou chercher dans leurs sens ?
Merci pour les infos
Héhé, en effet ma réponse était influencée par ton idée d'imbrication, d'où la sous-requête, mais une simple jointure c'est tout aussi bien voire mieux. Il y a des débats entre les pro-subquery et les pro-join, c'est intéressant mais c'est surtout une question qui se pose pour les très gros volumes. J'imagine que ce n'est pas ton cas, alors je te conseille de garder la requête que tu préfères !
Ah ah ah je vois que tu milite a fond, je vais me pencher dessus.

Par contre j'ai entendu dire que certain hébergeur ne géré pas cette fonction .
Info ou intox ???
spawns a écrit :
Ah ah ah je vois que tu milite a fond, je vais me pencher dessus.

Par contre j'ai entendu dire que certain hébergeur ne géré pas cette fonction .
Info ou intox ???

info... Certains hébergeurs sont trop c*ns pour fournir du PHP 5 ^^ (c'est une fonction native à partir de PHP 5)
Non... sans déconner, ya encore des hébergeurs sans PHP5 ??? Des hébergeurs uniquement PHP4 ? Aaah, j'y crois pas ! Pour rappel, la première version de PHP5, c'était en 2004... Et d'après ce que je lis sur Wikipedia, PHP4 n'est plus maintenu depuis 2007 !
Modifié par petibato (24 Oct 2013 - 09:44)
[quote=petibato]Non... sans déconner, ya encore des hébergeurs sans PHP5 ??? Des hébergeurs uniquement PHP4 ? Aaah, j'y crois pas ! Pour rappel, la première version de PHP5, c'était en 2004... Y a des hébergeurs qui proposent encore couramment des mutualisés en php 4. (et oui c'est... Smiley sweatdrop