Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/08/2007, 16h47   #1
Membre du Club
 
Homme Jérôme
Ingénieur développement logiciels
Inscription : juillet 2007
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 26
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Conseil

Informations forums :
Inscription : juillet 2007
Messages : 109
Points : 54
Points : 54
Par défaut [SQL] Tris successifs avec un limit

Bonjour à tous,

J'ai une table mysql qui stocke mes interventions.
Avec un select et un limit je ne sélectionne que 20 lignes (les 20 interventions les plus récentes).

Je souhaiterai rendre à l'utilisateur possible de trier ces 20 lignes sur tous le champ qu'il sélectionnera.

Code sql :
1
2
3
4
5
SELECT *,nomclient,nomsite 
FROM intervention,client, site 
WHERE interventionvalider="OUI" AND numcr !="NULL" AND client.numclient=intervention.numclient AND intervention.numsite=site.numsite 
ORDER BY dateintervention DESC 
LIMIT 20

Comment trier le résultat d'une requête. Une sous-requete?
LestoK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2007, 23h12   #2
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Ben avec ORDER BY que tu utilises déjà, non ?

Je n'ai peut-être pas compris ce que tu essaies de faire ..
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 09h26   #3
Membre du Club
 
Homme Jérôme
Ingénieur développement logiciels
Inscription : juillet 2007
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 26
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Conseil

Informations forums :
Inscription : juillet 2007
Messages : 109
Points : 54
Points : 54
J'ai en partie trouvé après une recherche dans le manuel de mySQL

Code :
1
2
3
4
5
$reqinterventionsoldee="SELECT * from intervention,client, site
		where interventionvalider=\"OUI\" and numcr !=\"NULL\" 
		and client.numclient=intervention.numclient
		and intervention.numsite=site.numsite
		order by dateintervention desc , numemploye LIMIT 20";
Si je met l'order by choisi par le visiteur, il ne sélectionnera pas les 20 même lignes. Il faut que ce soit les même 20 lignes (filtre sur la date) et qu'ensuite le tri permette l'affichage par ordre des nom, des numero de compte rendu des intervenants etc...

Avec la sous requete suivante seul 3 tris sur 8 créent une erreur SQL et ce ne sont pas les plus importants.

Code :
1
2
3
4
 
$reqfinale="select * from ( ".$reqinterventionsoldee." ) as R1 order by ".$sortcr." ".$or." LIMIT 20";
	//echo $reqfinale;
	$reqinterventionsoldee=$c->query($reqfinale);
LestoK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 09h28   #4
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Citation:
Envoyé par Bisûnûrs
Ben avec ORDER BY que tu utilises déjà, non ?

Je n'ai peut-être pas compris ce que tu essaies de faire ..
Ouais nan parce que ce qu'il veut c'est trier les 20 interventions les plus récentes selon un critère autre que la date, or, pour récupérer les 20 plus récentes il lui faut un critère de tri sur la date...

Ce que tu peux faire c'est ca : la premiere fois tu fais ta requete normale et tu affiches les 20 triées par date. Tu conserves alors dans une variable la liste des id de tes opérations. Comme ca a la seconde requete tu fais quelquechose du style
Code sql :
SELECT * FROM matable WHERE id_intervention IN (12,15,16,...) ORDER BY critere_choisi
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 10h00   #5
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Ben je pense que ça suffit :

Code sql :
1
2
3
4
5
SELECT *,nomclient,nomsite 
FROM intervention,client, site 
WHERE interventionvalider="OUI" AND numcr !="NULL" AND client.numclient=intervention.numclient AND intervention.numsite=site.numsite 
ORDER BY dateintervention DESC, critere2 ASC, critere3 DESC
LIMIT 20
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 10h04   #6
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Citation:
Envoyé par Bisûnûrs
Ben je pense que ça suffit :

Code sql :
1
2
3
4
5
SELECT *,nomclient,nomsite 
FROM intervention,client, site 
WHERE interventionvalider="OUI" AND numcr !="NULL" AND client.numclient=intervention.numclient AND intervention.numsite=site.numsite 
ORDER BY dateintervention DESC, critere2 ASC, critere3 DESC
LIMIT 20
Bah non, parce que la tes résultats ne seront jamais triés selon les critères 2 et 3 vu qu'ils sont déjà triés selon la date.
Le critère 2 n'est appliqué que lorsque les valeurs du critère 1 sont identiques!
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 10h08   #7
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Citation:
Envoyé par koopajah
Le critère 2 n'est appliqué que lorsque les valeurs du critère 1 sont identiques!
Ah oui, exact, je me suis embrouillé ..
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 10h11   #8
Membre régulier
 
Inscription : novembre 2005
Messages : 371
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 371
Points : 80
Points : 80
Si j'ai bien compris la demande....

J'utilise la meme chose dans l'un de mes scripts.

En fait je fais un select en fonction d'un champ supplementaire que je remplie dans la BDD a chaque fois qu'une ligne se remplie, je trie les lignes que je veux afficher en rapprot de ce champ.

Ensuite je fais un switch avec différents order by en fonction de champs récupérés dans l'url.

Mais a la base, il faut qu'a chaque insert un champ se remplisse permettant de faire un trie initial, cela peut etre la date comme autre chose.

Exemple :
J'ai un formulaire qui insert des clients nom prenom adresses code postal, etc... et la date

J'autorise des personnes a afficher les clients en fonction de la date (+ récent) et d'un substr du code postal.

ensuite dnas l'affichage, le personne peut classer les demandes par nom (ordre alphabetique), par code postal, etc.....en passant la variable de trie dans l'url que je récupere avec un get et que je balance dans un switch terminant ma syntaxe du select par order by $var.

et le tour est joué
kaolivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 10h18   #9
Membre du Club
 
Homme Jérôme
Ingénieur développement logiciels
Inscription : juillet 2007
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 26
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Conseil

Informations forums :
Inscription : juillet 2007
Messages : 109
Points : 54
Points : 54
Je suis en train de tester avec les id dans un IN... C'était la pause café
LestoK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 10h21   #10
Membre régulier
 
Inscription : novembre 2005
Messages : 371
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 371
Points : 80
Points : 80
un petit code :


Code :
1
2
3
4
 
url http://..../toto.php?class=NOM
ou 
url http://..../toto.php?class=CP    // code postal

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
$class=@$_GET['class'];
$sql = "SELECT * FROM table where ....'";
 
switch($class) 
{
case 'NOM': $sql .= " order by NOM LIMIT .....";break;
case 'CP': $sql .= " order by CODE_POSTAL LIMIT .....";break;
//etc...
}
$query = mysql_query($sql, $conn);
// etc
}
kaolivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 10h27   #11
Membre du Club
 
Homme Jérôme
Ingénieur développement logiciels
Inscription : juillet 2007
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 26
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Conseil

Informations forums :
Inscription : juillet 2007
Messages : 109
Points : 54
Points : 54
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

C'est réglé pour la sous requete dans le IN. Je vais stocké dans une variable.
LestoK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 10h29   #12
Membre régulier
 
Inscription : novembre 2005
Messages : 371
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 371
Points : 80
Points : 80
et ce que je te propose....
kaolivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 10h29   #13
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Citation:
Envoyé par LestoK
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

C'est réglé pour la sous requete dans le IN. Je vais stocké dans une variable.
T'as quelle version de mysql ?
et la deuxieme fois t'as pas besoin des LIMIT vu que tu as déjà la liste des 20 ID

Sinon tu fais ton tableau et tu le "serialize" dans un fichier comme ca quand on veut trier tu peux juste faire unserialize()
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 10h30   #14
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Citation:
Envoyé par kaolivier
et ce que je te propose....
Je comprends pas, ce que tu lui proposes toi c'est la manière de passer le critère de tri choisi par l'utilisateur. Mais par contre ca change pas le probleme d'ordonner correctement le résultat de la requete (lis les messages entre Bisûnûrs et moi)
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 10h47   #15
Membre du Club
 
Homme Jérôme
Ingénieur développement logiciels
Inscription : juillet 2007
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 26
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Conseil

Informations forums :
Inscription : juillet 2007
Messages : 109
Points : 54
Points : 54
Citation:
Envoyé par koopajah
T'as quelle version de mysql ?
et la deuxieme fois t'as pas besoin des LIMIT vu que tu as déjà la liste des 20 ID

Sinon tu fais ton tableau et tu le "serialize" dans un fichier comme ca quand on veut trier tu peux juste faire unserialize()
Il s'agit de la version 4.1.9 en local

Voici la solution que j'ai trouvé où tout fonctionne comme je le souhaite.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
	$reqinterventionsoldee="SELECT numintervention from intervention
		where interventionvalider=\"OUI\" and numcr !=\"NULL\" 
		order by dateintervention desc , numemploye LIMIT 20";
 
	// JE CREE UNE CHAINE $valeur recuperant les ids de mes interventions soldees
	$valeur='';
 
	$resinterv=$c->query($reqinterventionsoldee);
	$i=0;
	while($id=$c->recupDonnee($resinterv))
	{
		if($i==0)
			$valeur=$id['numintervention'];
		else $valeur=$valeur.", ".$id['numintervention'];
		$i++;
	}
 
	//echo $valeur;
	// A l'affichage... 934, 656.... , 567
 
	//echo $reqinterventionsoldee;
	$reqfinale="select * from intervention i where i.numintervention IN ( ".$valeur." ) order by ".$sortcr." ".$or;
	echo $reqfinale;
 
 
---> select * from intervention i where i.numintervention IN ( 973, 968, 972, 963, 969, 962, 964, 965, 971, 970, 673, 966, 943, 944, 942, 672, 945, 940, 941, 728 ) order by numemploye ASC
// le dernier order by est le critere choisi par le visiteur
Merci à tous
LestoK est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h22.


 
 
 
 
Partenaires

Hébergement Web