par
Calimero » 26 mars 2010, 15:49
On peut, mais comme de toute façon tu vas devoir gérer en php les cas limites (si pas de précédente car courante==première, ou pas de suivante car courante==dernière) tu ne vas pas gagner grand-chose au final.
On fait comment ?
Parce qu'on gagne quand-même un peu :
Je suis à peu près dans le même cas de figure : j'affiche le détail d'un article, et en bas j'ai les liens vers articles précédent et suivant.
Et je passe 3 requêtes :
SELECT * FROM matable WHERE nom = &nom;
SELECT * FROM matable WHERE nom < &nom SORT by nom DESC LIMIT 1,1;
SELECT * FROM matable WHERE nom > &nom SORT by nom LIMIT 1,1;
(je sais je pourrais ne passer que deux requêtes, mais tant qu'à faire comme ça c'est plus lisible

)
Mine de rien, si je peux réduire le nombre de requêtes à 1, ce serait une sacrée optimisation...
Si je n'ai pas donné la réponse tout de suite c'est parceque la réponse va vous décevoir.
L'astuce réside dans l'utilisation du mot-clé UNION pour "fusionner" les résultats des trois requêtes (on peut probablement descendre ce chiffre à deux).
Le potentiel d'optimisation pour MySQL est nul ou presque. Le potentiel d'alourdissement supplémentaire du code php, venant du fait que ton recordset peut contenir 0, 1, 2 ou 3 tuples (4 cas à gérer donc !) est bien réel lui par contre.
Quelquechose dans ce style (non testé, à corriger si nécessaire) :
SELECT * FROM matable WHERE nom <= $_______ ORDER BY NOM ASC LIMIT 1,2
UNION
SELECT * FROM matable WHERE nom > $_______ ORDER BY by nom LIMIT 1,1;
[quote="macgawel"][quote="Calimero"][quote="Const"][b]On peut[/b], mais comme de toute façon tu vas devoir gérer en php les cas limites (si pas de précédente car courante==première, ou pas de suivante car courante==dernière) tu ne vas pas gagner grand-chose au final.[/quote][/quote]
On fait comment ?
Parce qu'on gagne quand-même un peu :
Je suis à peu près dans le même cas de figure : j'affiche le détail d'un article, et en bas j'ai les liens vers articles précédent et suivant.
Et je passe 3 requêtes :
SELECT * FROM matable WHERE nom = &nom;
SELECT * FROM matable WHERE nom < &nom SORT by nom DESC LIMIT 1,1;
SELECT * FROM matable WHERE nom > &nom SORT by nom LIMIT 1,1;
(je sais je pourrais ne passer que deux requêtes, mais tant qu'à faire comme ça c'est plus lisible :-o )
Mine de rien, si je peux réduire le nombre de requêtes à 1, ce serait une sacrée optimisation...[/quote]
Si je n'ai pas donné la réponse tout de suite c'est parceque la réponse va vous décevoir.
L'astuce réside dans l'utilisation du mot-clé UNION pour "fusionner" les résultats des trois requêtes (on peut probablement descendre ce chiffre à deux).
Le potentiel d'optimisation pour MySQL est nul ou presque. Le potentiel d'alourdissement supplémentaire du code php, venant du fait que ton recordset peut contenir 0, 1, 2 ou 3 tuples (4 cas à gérer donc !) est bien réel lui par contre.
Quelquechose dans ce style (non testé, à corriger si nécessaire) :
[sql]SELECT * FROM matable WHERE nom <= $_______ ORDER BY NOM ASC LIMIT 1,2
UNION
SELECT * FROM matable WHERE nom > $_______ ORDER BY by nom LIMIT 1,1;[/sql]