Récuperer des lignes dans un ordre précis avec une seule requête - PHP - Programmation
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 ?
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é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 ?
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 :
|
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 ^^.
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 ?
Quant à ta phrase
Citation : |
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
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). |
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.
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
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.
|
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
Marsh Posté le 14-07-2014 à 03:42:53
Pablo Escrobarbe a écrit : |
Merci
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:
Mais est-ce possible dans une seule requête d'intégrer un ordre à suivre ?
Genre (mais ca ne fonctionne pas ):
Merci
Message édité par clockover le 08-07-2014 à 02:57:47