IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[SQL] Tris successifs avec un limit


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 : 83
    Points
    83
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  2. #2
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 882
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 882
    Points : 16 286
    Points
    16 286
    Par défaut
    Ben avec ORDER BY que tu utilises déjà, non ?

    Je n'ai peut-être pas compris ce que tu essaies de faire ..

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 : 83
    Points
    83
    Par défaut
    J'ai en partie trouvé après une recherche dans le manuel de mySQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $reqfinale="select * from ( ".$reqinterventionsoldee." ) as R1 order by ".$sortcr." ".$or." LIMIT 20";
    	//echo $reqfinale;
    	$reqinterventionsoldee=$c->query($reqfinale);

  4. #4
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM matable WHERE id_intervention IN (12,15,16,...) ORDER BY critere_choisi

  5. #5
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 882
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 882
    Points : 16 286
    Points
    16 286
    Par défaut
    Ben je pense que ça suffit :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Citation Envoyé par Bisûnûrs
    Ben je pense que ça suffit :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  7. #7
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 882
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 882
    Points : 16 286
    Points
    16 286
    Par défaut
    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é ..

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    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é

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 : 83
    Points
    83
    Par défaut
    Je suis en train de tester avec les id dans un IN... C'était la pause café

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    un petit code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    url http://..../toto.php?class=NOM
    ou 
    url http://..../toto.php?class=CP    // code postal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    }

  11. #11
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 : 83
    Points
    83
    Par défaut
    #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.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    et ce que je te propose....

  13. #13
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    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()

  14. #14
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    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)

  15. #15
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 : 83
    Points
    83
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri successif avec Comparator
    Par adissa357 dans le forum Général Java
    Réponses: 11
    Dernier message: 16/10/2013, 23h02
  2. Limite 3 tris successifs en vba?
    Par PradBoule dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/07/2012, 21h23
  3. [SQL] tri d'un resultat avec boucle for
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 11/09/2007, 14h30
  4. [SQL] Problème requête avec Limit 1
    Par miss_monika dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 13/06/2007, 10h16
  5. tri obligatoire avec DISTINCT?
    Par Marseillais9 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 31/07/2003, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo