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

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

Marsh Posté le 08-07-2014 à 02:45:43    

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
Reply

Marsh Posté le 08-07-2014 à 02:45:43   

Reply

Marsh Posté le 08-07-2014 à 10:47:27    

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
Reply

Marsh Posté le 08-07-2014 à 18:52:06    

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 ?
 

Reply

Marsh Posté le 08-07-2014 à 19:04:07    

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
Reply

Marsh Posté le 09-07-2014 à 02:26:32    

Reply

Marsh Posté le 09-07-2014 à 09:29:50    

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
Reply

Marsh Posté le 09-07-2014 à 10:18:12    

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
Reply

Marsh Posté le 09-07-2014 à 11:05:13    

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
Reply

Marsh Posté le 14-07-2014 à 03:42:08    

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

Reply

Marsh Posté le 14-07-2014 à 03:42:53    

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 :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed