Clibler une valeur et recupérer sa précedente et sa suivante

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Clibler une valeur et recupérer sa précedente et sa suivante

par Cyrano » 27 avr. 2008, 09:06

Plusieurs choses :

Code : Tout sélectionner

SELECT * FROM revue_presse WHERE date_revue='2004' AND id_revue="3" (par exemple) ORDER BY id_revue;
Dans cette requête, le ORDER BY ainsi que la clause WHERE sur la date sont strictement inutiles dans la mesure où tu pointes sur un identifiant précis dans la clause WHERE. Donc tu pourrais la réduire à :

Code : Tout sélectionner

SELECT * FROM revue_presse WHERE id_revue="3";
Tu obtiendra strictement le même résultat.

Pour le reste : en une seule requête, ça ferait un gros tas de code qui ne sera pas forcément d'une efficacité redoutable, donc en découpant, ça ferait une requête pour récupérer la précédente et une pour la suivante. Pour l'expérience, j'ai fait un petit jeu d'essai :

Code : Tout sélectionner

mysql> CREATE TABLE revue_presse ( -> id_revue int(10) NOT NULL auto_increment primary key, -> nom_revue text NOT NULL, -> date_revue int(4) NOT NULL -> ); Query OK, 0 rows affected (0.03 sec) mysql> mysql> INSERT INTO revue_presse (nom_revue, date_revue) VALUES -> ('Revue 1', 2004), -> ('Revue 2', 2004), -> ('Revue 3', 2005), -> ('Revue 4', 2004), -> ('Revue 5', 2003), -> ('Revue 6', 2006), -> ('Revue 7', 2005), -> ('Revue 8', 2004); Query OK, 8 rows affected (0.00 sec) Records: 8 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM revue_presse; +----------+-----------+------------+ | id_revue | nom_revue | date_revue | +----------+-----------+------------+ | 1 | Revue 1 | 2004 | | 2 | Revue 2 | 2004 | | 3 | Revue 3 | 2005 | | 4 | Revue 4 | 2004 | | 5 | Revue 5 | 2003 | | 6 | Revue 6 | 2006 | | 7 | Revue 7 | 2005 | | 8 | Revue 8 | 2004 | +----------+-----------+------------+ 8 rows in set (0.00 sec)
Si on classe ça par ordre chronologique, ça va donner ça :

Code : Tout sélectionner

mysql> SELECT rp.* -> FROM revue_presse rp -> ORDER BY date_revue, id_revue; +----------+-----------+------------+ | id_revue | nom_revue | date_revue | +----------+-----------+------------+ | 5 | Revue 5 | 2003 | | 1 | Revue 1 | 2004 | | 2 | Revue 2 | 2004 | | 4 | Revue 4 | 2004 | | 8 | Revue 8 | 2004 | | 3 | Revue 3 | 2005 | | 7 | Revue 7 | 2005 | | 6 | Revue 6 | 2006 | +----------+-----------+------------+ 8 rows in set (0.00 sec)
En partant de l'article 3, le précédent est donc le 8 et le suivant, le 7. Voici comment je les récupère :

Code : Tout sélectionner

mysql> SELECT MAX(id_revue) AS precedent -> FROM revue_presse -> WHERE date_revue <= (SELECT date_revue FROM revue_presse WHERE id_revue = 3) -> AND id_revue <> 3; +-----------+ | precedent | +-----------+ | 8 | +-----------+ 1 row in set (0.00 sec) mysql> mysql> SELECT id_revue AS suivant -> FROM revue_presse -> WHERE date_revue >= (SELECT date_revue FROM revue_presse WHERE id_revue = 3) -> AND id_revue <> 3 -> ORDER BY date_revue -> LIMIT 0,1; +---------+ | suivant | +---------+ | 7 | +---------+ 1 row in set (0.00 sec)
Ça devrait te donner une base pour avancer :-k

par ouckileou » 27 avr. 2008, 00:16

Je comprends pas, dans "date_revue" y'a que l'année donc le classement se fait à la fois sur année et id ?

C'est un peu bizarre comme système, pourquoi y'a pas une date complète dans ta colonne "date_revue" ? Un id sert à identifier, tu sais pas trop comment ils seront attribués donc se baser dessus pour ton tri c'est heu... bancal.

Voilà sinon c'est "marche pas" : erreur (et si oui, LAQUELLE ?), aucun résulta, autre ?

Clibler une valeur et recupérer sa précedente et sa suivante

par darontankian » 24 avr. 2008, 17:43

Bonjour,

Voila je voudrai effectuer une requete SQL qui me permettrai de recupéré 3 valeur dans une table:
-celle que je donne (la ca va ^^)
-sa précedente dans la table (précedente en terme d'id)
-sa suivante

ma requete en faite devra chercher dans ma base ces 3 images en fonction de leur date:

J'ai donc pour le moment :

Code : Tout sélectionner

SELECT * FROM revue_presse WHERE date_revue='2004' AND id_revue="3" (par exemple) ORDER BY id_revue;
J'utilise PHPMyAdmin

Schema Table :

Code : Tout sélectionner

CREATE TABLE revue_presse { id_revue int(10) NOT NULL auto_increment primary key, nom_revue text NOT NULL, date_revue int(4) NOT NULL;}
La suivante et la precedente n'etan evidemment pas 2 et la suivante 4 (2 et 4 pouvant etre de date 2005 par exemple) Merci d'avance

J'essai de decoupé ces 3 resultat en 3 requetes.
Celle pour recupéré les donnée de l'id données bon eviemment ca c fai, pour les precedentes et les suivant j'ai un début d'idée mais je sais pas trop comment finir ca...

Code : Tout sélectionner

SELECT id_revue FROM revue_presse WHERE date_revue=2004 AND id_revue < (SELECT id_revue FROM revue_presse WHERE date_revue=2004 AND id_revue=3) LIMIT 0,1
je test ca...

Marche pas