Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1465 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Récuperer des lignes dans un ordre précis avec une seule requête

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Récuperer des lignes dans un ordre précis avec une seule requête

n°2232926
clockover
That's the life
Posté le 08-07-2014 à 02:45:43  profilanswer
 

Bonsoir,
 
Petite question, j'ai une fonction assez mignonne (assez longue et que je voudrais éviter de toucher du coup) qui fonctionne avec une simple requête SQL qui passe en variable.
 
Et là j'ai un cas, ou j'ai besoin d'ordonner les lignes retournées par rapport à une valeur que je dois calculer (non contenue en base).
Donc je calcule, je tri dans mon ordre voulu, jusque là ça va. J'ai donc une liste des id dans un array et dans l'ordre que je les veux.
 
Actuellement, j'envoie les id une par une sur cette fonction via:
 

Code :
  1. fonction("SELECT * from table WHERE id=$îd" );


 
Mais est-ce possible dans une seule requête d'intégrer un ordre à suivre ?
 
Genre (mais ca ne fonctionne pas ;)):

Code :
  1. fonction("SELECT * from table WHERE id=$îd OR id=$id2...." );


 
Merci :)


Message édité par clockover le 08-07-2014 à 02:57:47
mood
Publicité
Posté le 08-07-2014 à 02:45:43  profilanswer
 

n°2232934
rufo
Pas me confondre avec Lycos!
Posté le 08-07-2014 à 10:47:27  profilanswer
 

Déjà, surtout éviter le OR, ça flingue les SGBD. Préférer IN (mais c'est pas top non plus pour les perfs).
 
$îd -> pas une bonne idée de nommer une variable avec une lettre accentué :/
 
Il faudrait que tu nous en dises un peu plus sur la structure de tes données et du calcul de l'ordre. Tu utilises quelles données pour faire ce calcul ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2232996
clockover
That's the life
Posté le 08-07-2014 à 18:52:06  profilanswer
 

rufo a écrit :

Déjà, surtout éviter le OR, ça flingue les SGBD. Préférer IN (mais c'est pas top non plus pour les perfs).
 
$îd -> pas une bonne idée de nommer une variable avec une lettre accentué :/
 
Il faudrait que tu nous en dises un peu plus sur la structure de tes données et du calcul de l'ordre. Tu utilises quelles données pour faire ce calcul ?


Désolé pour le $îd, c'est juste du code pour donner l'idée de ce que je voulais faire et j'ai tapé un peu vite.
 
J'ignorais pour le OR. Quand tu dis que ca flingue, tu parles en terme de perf ?
 

n°2232998
clockover
That's the life
Posté le 08-07-2014 à 19:04:07  profilanswer
 

Prenons cet exemple avec deux tables:
 
table utilisateur: id,nom,prenom...
table ville: id,nom,code postal,id_utilisateur...
 
Ma fonction "affichage" ne sert elle qu'à afficher les lignes retournées par la requête SQL. La difficulté c'est que dedans il y a du javascript qui dépend justement du nombre de ligne retournées.
L'exemple ci-dessous ne pose donc pas de soucis

Code :
  1. affichage("SELECT * FROM utilisateur LEFT JOIN ville ON ville.id_utilisateur = utilisateur.id ORDER BY $ce-que-je-veux$" );


 
Cependant dans un cas particulier, j'ai besoin de calculer une valeur qui dépend d'une variable de session. Imaginons la distance entre les personnes dans la base et la personne qui consulte la page.
J'ai donc une autre fonction distance(). Qui elle calcule cela.  
Elle me retourne un array avec les utilisateur.id dans l'ordre que je veux.
 
La question est: Est-ce que je peux former un ordre pour ma fonction affichage en une seule requête SQL en possédant juste les id. Ce qui m'éviterait de changer beaucoup de chose.  
Sinon ba je changerais les fonctions ^^.


Message édité par clockover le 08-07-2014 à 19:04:53
n°2233044
clockover
That's the life
Posté le 09-07-2014 à 02:26:32  profilanswer
 
n°2233050
rufo
Pas me confondre avec Lycos!
Posté le 09-07-2014 à 09:29:50  profilanswer
 

Pour le OR, oui, je parle des perfs qui sont fortement dégradées.
 

Citation :

affichage("SELECT * FROM utilisateur LEFT JOIN ville ON ville.id_utilisateur = utilisateur.id ORDER BY $ce-que-je-veux$" );


Rassure-moi, affichage() n'est pas une fonction javascript qui rpend en paramètre une requête sql qui sera ensuite exécutée par le serveur ? :ouch:  
 
Quant à ta phrase

Citation :


Ma fonction "affichage" ne sert elle qu'à afficher les lignes retournées par la requête SQL. La difficulté c'est que dedans il y a du javascript qui dépend justement du nombre de ligne retournées.  


Elle me fait présager le pire quant à la séparation du code en MVC (design pattern) ou, au minimum, la séparation bien nette du php, html, css et js :(


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2233052
Pablo Escr​obarbe
Retour d'exil
Posté le 09-07-2014 à 10:18:12  profilanswer
 

rufo a écrit :

Déjà, surtout éviter le OR, ça flingue les SGBD. Préférer IN (mais c'est pas top non plus pour les perfs).
 
$îd -> pas une bonne idée de nommer une variable avec une lettre accentué :/
 
Il faudrait que tu nous en dises un peu plus sur la structure de tes données et du calcul de l'ordre. Tu utilises quelles données pour faire ce calcul ?


 
Pour donner une idée : "
 
I needed to know this for sure, so I benchmarked both methods. I consistenly found IN to be much faster than using OR.
 
Do not believe people who give their "opinion", science is all about testing and evidence.
 
I ran a loop of 1000x the equivalent queries (for consistency, I used sql_no_cache):
 
IN: 2.34969592094s
 
OR: 5.83781504631s "
 
Donc oui le IN est quand même bien plus rapide.


---------------
Viens jouer aux Rébus sur HFR
n°2233055
rufo
Pas me confondre avec Lycos!
Posté le 09-07-2014 à 11:05:13  profilanswer
 

Ca confirme ce que je pensais et avais déjà constaté, sans avoir fait de réelles mesures : le IN est plus rapide que le OR (apparemment, environ x2), mais c'est pas la panacée. Si on peut se passer du IN, faut pas s'en priver :)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2233307
clockover
That's the life
Posté le 14-07-2014 à 03:42:08  profilanswer
 

rufo a écrit :

Pour le OR, oui, je parle des perfs qui sont fortement dégradées.
 

Citation :

affichage("SELECT * FROM utilisateur LEFT JOIN ville ON ville.id_utilisateur = utilisateur.id ORDER BY $ce-que-je-veux$" );


Rassure-moi, affichage() n'est pas une fonction javascript qui rpend en paramètre une requête sql qui sera ensuite exécutée par le serveur ? :ouch:  
 
Quant à ta phrase

Citation :


Ma fonction "affichage" ne sert elle qu'à afficher les lignes retournées par la requête SQL. La difficulté c'est que dedans il y a du javascript qui dépend justement du nombre de ligne retournées.  


Elle me fait présager le pire quant à la séparation du code en MVC (design pattern) ou, au minimum, la séparation bien nette du php, html, css et js :(


 
Point 1, soit rassuré ;)
 
Point 2, il n'est pas très lourd à séparer. Mais bon j'apprends petit à petit. Je suis pas webmaster de formation ;).
J'ai même pas d'IDE pour travailler :D

n°2233308
clockover
That's the life
Posté le 14-07-2014 à 03:42:53  profilanswer
 

Pablo Escrobarbe a écrit :


 
Pour donner une idée : "
 
I needed to know this for sure, so I benchmarked both methods. I consistenly found IN to be much faster than using OR.
 
Do not believe people who give their "opinion", science is all about testing and evidence.
 
I ran a loop of 1000x the equivalent queries (for consistency, I used sql_no_cache):
 
IN: 2.34969592094s
 
OR: 5.83781504631s "
 
Donc oui le IN est quand même bien plus rapide.


Merci :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Récuperer des lignes dans un ordre précis avec une seule requête

 

Sujets relatifs
Oracle - Requête SQL outer joinMySQL : 1h pour une requête avec un NOT IN, conseils pour optimiser ?
suppression de doublons après traitement de la seule copie restanteRésumer plusieurs lignes en une seule
[python] Afficher primitive/figure au premier plan (Windows)le nombre des In/Out à l'exécution d'une requete
Afficher le nombre de résultat pour chaque enregistrement phpQuelle base pour 100 millions de lignes par jour
SQL et les Update multi lignes 
Plus de sujets relatifs à : Récuperer des lignes dans un ordre précis avec une seule requête


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR