Selectionner une ligne, puis celle d'avant et celle d'après

Eléphanteau du PHP | 31 Messages

24 mars 2010, 14:09

Bonjour,

Existe-t-il un moyen, avec une requête, de selectionner un résultat, par exemple, un client. Mais aussi de selectionner le client d'avant et celui d'après ?

Pour celui d'après, c'est simple avec LIMIT 2, mais celui d'avant ?
J'ai chercher si LIMIT -1, 3 fonctionnait, mais il semble que non, mais le principe est là :)

Une idée ?
Const.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

24 mars 2010, 16:14

Pourquoi veux-tu faire ça ? À quoi correspondent "le client d'avant" et "le client d'après" ?

Dans une base de données, les données ne sont pas forcément stockées dans un ordre logique, c'est à la sélection qu'on les trie.

Eléphanteau du PHP | 31 Messages

24 mars 2010, 19:36

Pourquoi veux-tu faire ça ? À quoi correspondent "le client d'avant" et "le client d'après" ?

Dans une base de données, les données ne sont pas forcément stockées dans un ordre logique, c'est à la sélection qu'on les trie.
Oui mais par exemple, je veux sélectionner la facture d'un client. Bah je voudrait la facture d'avant, et celle d'après (par numéro). Je l'ai fait en php, mais je trouve ça lourd, donc je me demandais si on ne pouvait pas trouver un équivalent à "LIMIT -1, 3".
Const.

ViPHP
ViPHP | 2287 Messages

24 mars 2010, 19:47

Pourquoi veux-tu faire ça ? À quoi correspondent "le client d'avant" et "le client d'après" ?

Dans une base de données, les données ne sont pas forcément stockées dans un ordre logique, c'est à la sélection qu'on les trie.
Oui mais par exemple, je veux sélectionner la facture d'un client. Bah je voudrait la facture d'avant, et celle d'après (par numéro). Je l'ai fait en php, mais je trouve ça lourd, donc je me demandais si on ne pouvait pas trouver un équivalent à "LIMIT -1, 3".
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.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 672 Messages

26 mars 2010, 12:45

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

Mine de rien, si je peux réduire le nombre de requêtes à 1, ce serait une sacrée optimisation...

ViPHP
ViPHP | 2287 Messages

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

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;
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphanteau du PHP | 31 Messages

06 août 2010, 17:12

Merci quand même ! :)
Const.

Eléphant du PHP | 74 Messages

08 août 2010, 12:08

Tout dépend de la structure de la table mais pourquoi pas quelque chose du genre:

SELECT * FROM matable WHERE id_client = XXX AND id_facture IN ( "XXX-1", "XXX", "XXX+1" );

ou

SELECT * FROM matable WHERE id_client = XXX AND ( id_facture = XXX-1 OR id_facture = XXX OR id_facture = XXX+1 );

Eléphant du PHP | 398 Messages

10 août 2010, 16:31

J ai eu a faire le meme systeme sauf que c etait pour un blog ou sur un article, j affichait le lien de l article suivant et de l article precedent.

Voila la requete SQL que j avais fait :
SELECT
					--id_article || \"precedent\" as position ,
					id_article,
					date_article,
					titre_url_article,
					titre_article
				FROM " . $this->m_nAccesBD->__getTable() . " 
				WHERE 
					id_article = ( SELECT MAX( id_article ) FROM " . $this->m_nAccesBD->__getTable() . " WHERE id_article < ".$this->__getIdArticle()." )
				UNION
				SELECT 
					--id_article || \"suivant\" as position ,
					id_article,
					date_article,
					titre_url_article,
					titre_article 
				FROM " . $this->m_nAccesBD->__getTable() . " 
				WHERE 
					id_article = ( SELECT MIN( id_article ) FROM " . $this->m_nAccesBD->__getTable() . " WHERE id_article > ".$this->__getIdArticle()." )
				
Si ça peut t'aider :)
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe