Valeur précédante, valeur 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 : Valeur précédante, valeur suivante

par Patriboom » 01 sept. 2008, 14:04

Merci à vous. Je monterai deux requêtes et ce sera plus simple.
À quoi doit donc ressembler la sortie attendue dans ces deux cas au juste ??
C'était la vieille question du classement (le lien que je citais en introduction) qui me trottait encore en tête et que je n'avais pas résolu avec satisfaction. Une situation semblable se présentant à moi, je voulais trouver une solution. L'idée, c'est donc de perfectionner toujours davantage la maîtrise du langage et d'arriver à faire des choses plus puissantes et plus efficaces.

Il me semble que dans le cas présent, nous ayons atteint une limite du MySQL. Je mettrai donc "Abandonné" au sujet afin que d'autres usagers voient que c'est un cul-de-sac.

par Sékiltoyai » 01 sept. 2008, 08:32

Et avec un '<=' et un '>=' ?

par Cyrano » 01 sept. 2008, 07:20

Je saisis mal certains détails.

Dans un premier temps, je te propose une simplification de la requête :

Code : Tout sélectionner

SELECT P.Debit AS Pdebit, G.Debit AS Gdebit, P.id_releve AS Pid, G.id_releve AS Gid FROM kayak_releves AS C JOIN kayak_releves AS G ON C.Debit < G.Debit AND G.id_rapide = C.id_rapide JOIN kayak_releves AS P ON C.Debit > P.Debit AND P.id_rapide = C.id_rapide WHERE C.id_releve = 40 ORDER BY Pdebit DESC , Gdebit ASC;
Comme ça on fait sauter les sous-requêtes et on obtient la même chose :

Code : Tout sélectionner

+--------+--------+-----+-----+ | Pdebit | Gdebit | Pid | Gid | +--------+--------+-----+-----+ | 130.0 | 600.0 | 41 | 39 | | 130.0 | 600.0 | 38 | 39 | | 130.0 | 600.0 | 37 | 39 | | 120.0 | 600.0 | 43 | 39 | | 100.0 | 600.0 | 42 | 39 | +--------+--------+-----+-----+ 5 rows in set (0.00 sec)
Mais là aussi, si on indique 39 ou 42, on a rien en sortie parce que ce sont les extrêmes en matière de débit et que soit il n'y en a pas de plus fort (600), soit pas de plus faible (100)

À quoi doit donc ressembler la sortie attendue dans ces deux cas au juste ??

Valeur précédante, valeur suivante

par Patriboom » 01 sept. 2008, 03:25

Bonjour!

à partir de http://www.phpfrance.com/forums/viewtopic.php?t=17689, j'ai construit une requête qui fonctionne bien lorsque la valeur médiane se trouve flanquée d'une valeur plus grande et d'une valeur plus petite. Lorsqu'on arrive en bout de ligne, cependant, ça ne donne plus aucun résultat.

Voici plus de détails: je veux repérer dans un table des débits de rivières les inscriptions faites pour une rivière X dont le débit est plus faible (première valeur) ou dont le débit est plus fort (seconde valeur). Le but de cela est d'offrir un lien sur la page qui mène au schema "Voir la situation dans le cas d'un débit plus faible" et bien sûr "Voir la ... débit plus fort".

Voici la structure de la table avec quelques données ( MySQL )


Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.11.3deb1ubuntu1 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Dim 31 Août 2008 à 21:20 -- Version du serveur: 5.0.51 -- Version de PHP: 5.2.4-2ubuntu5.3 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de données: `daniel` -- -- -------------------------------------------------------- -- -- Structure de la table `kayak_releves` -- CREATE TABLE IF NOT EXISTS `kayak_releves` ( `id_releve` int(11) NOT NULL auto_increment, `id_rapide` int(11) NOT NULL, `Debit` decimal(10,1) NOT NULL, `Unite` varchar(20) NOT NULL default 'm<sup>3</sup>/s', `auteur` int(11) NOT NULL, `creation` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `photo` varchar(30) NOT NULL, `Approche` text NOT NULL, `Negociation` text NOT NULL, `Sortie` text NOT NULL, PRIMARY KEY (`id_releve`), KEY `Niveau_croiss` (`id_rapide`,`Debit`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=44 ; -- -- Contenu de la table `kayak_releves` -- INSERT INTO `kayak_releves` (`id_releve`, `id_rapide`, `Debit`, `Unite`, `auteur`, `creation`, `photo`, `Approche`, `Negociation`, `Sortie`) VALUES (1, 11, 130.0, 'm<sup>3</sup>/s ', 999, '2008-08-29 11:44:53', '', '', '', ''), (2, 11, -1.5, 'm<sup>3</sup>/s ', 999, '2008-08-29 11:44:41', '', '', '', ''), (43, 6, 120.0, 'm<sup>3</sup>/s', 999, '2008-08-31 20:22:33', '1_6_43_999.jpeg', 'Entrons en matière', 'Négocions bien', 'Et tout finira bien'), (42, 6, 100.0, 'm<sup>3</sup>/s', 999, '2008-08-31 20:22:33', '1_6_42_999.jpeg', 'Entrons en matière', 'Négocions bien', 'Et tout finira bien'), (41, 6, 130.0, 'm<sup>3</sup>/s', 999, '2008-08-29 14:21:27', '1_6_41_999.jpeg', 'Entrons en matière', 'Négocions bien', 'Et tout finira bien'), (40, 6, 200.0, 'm<sup>3</sup>/s', 999, '2008-08-31 20:22:33', '1_6_40_999.jpeg', 'Entrons en matière', 'Négocions bien', 'Et tout finira bien'), (39, 6, 600.0, 'm<sup>3</sup>/s', 999, '2008-08-31 20:22:33', '1_6_39_999.jpeg', 'Entrons en matière', 'Négocions bien', 'Et tout finira bien'), (38, 6, 130.0, 'm<sup>3</sup>/s', 999, '2008-08-29 14:12:01', '1_6_38_999.jpeg', 'Entrons en matière', 'Négocions bien', 'Et tout finira bien'), (37, 6, 130.0, 'm<sup>3</sup>/s', 999, '2008-08-29 14:01:17', '1_6_37_999.jpeg', 'Entrons en matière', 'Négocions bien', 'Et tout finira bien');


et ma requête

Code : Tout sélectionner

SELECT Petit.Debit AS Pdebit, Grand.Debit AS Gdebit, Petit.id_releve AS Pid, Grand.id_releve AS Gid FROM ( SELECT * FROM kayak_releves WHERE id_releve =40 ) AS Ceci JOIN ( SELECT * FROM kayak_releves WHERE id_rapide =6 ) AS Grand ON Ceci.Debit < Grand.Debit JOIN ( SELECT * FROM kayak_releves WHERE id_rapide =6 ) AS Petit ON Ceci.Debit > Petit.Debit ORDER BY Pdebit DESC , Gdebit ASC

Dans le cas présent, ça fonctionne (id_releve = 40), mais je n'obtiens aucun résultat dans le cas d'un id_releve = 39 alors que le débit de l'enregistrement est moindre que celui du 39.


Bien sûr, je pourrais faire deux requêtes, ce serait plus simple, mais ça exigerait deux fois plus du serveur.

Comment arriver à mes fins?

Merci à l'avance.