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

Plusieurs choses :
[code]SELECT * FROM revue_presse WHERE date_revue='2004' AND id_revue="3" (par exemple) ORDER BY id_revue;[/code]
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]SELECT * FROM revue_presse WHERE id_revue="3";[/code]
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]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)[/code]
Si on classe ça par ordre chronologique, ça va donner ça :
[code]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)[/code]
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]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)[/code]
Ça devrait te donner une base pour avancer :-k