Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/03/2011, 13h03   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 57
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 57
Points : 11
Points : 11
Par défaut MAX et DATE_ADD ensemble

Bonjour,

j'ai 2 tables, dont voici un extrait (suffisant pour faire des tests) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
CREATE TABLE IF NOT EXISTS `sell_offers` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `sell_id` int(11) UNSIGNED NOT NULL,
  `name` varchar(100) NOT NULL,
  `length` tinyint(8) UNSIGNED NOT NULL,
  `child_option` float UNSIGNED DEFAULT NULL,
  `active` tinyint(3) UNSIGNED NOT NULL DEFAULT '1',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=135 ;
 
--
-- Dumping data for table `sell_offers`
--
 
INSERT INTO `sell_offers` (`id`, `sell_id`, `name`, `length`, `child_option`, `active`) VALUES
(129, 65, '1', 2, NULL, 1),
(130, 65, '2', 8, NULL, 1),
(134, 65, '3', 7, NULL, 1);
 
 
 
-- phpMyAdmin SQL Dump
-- version 3.3.9.2
-- <a href="http://www.phpmyadmin.net" target="_blank">http://www.phpmyadmin.net</a>
--
-- Host: localhost
-- Generation Time: Mar 23, 2011 at 12:48 PM
-- Server version: 5.0.84
-- PHP Version: 5.2.10
 
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
 
--
-- Database: `suiteprivee_wip`
--
 
-- --------------------------------------------------------
 
--
-- Table structure for table `sell_nights`
--
 
CREATE TABLE IF NOT EXISTS `sell_nights` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `sell_offer_id` int(11) UNSIGNED NOT NULL,
  `date` date NOT NULL,
  `price` float UNSIGNED NOT NULL,
  `public_price` float UNSIGNED NOT NULL,
  `full` tinyint(8) UNSIGNED NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5647 ;
 
--
-- Dumping data for table `sell_nights`
--
 
INSERT INTO `sell_nights` (`id`, `sell_offer_id`, `date`, `price`, `public_price`, `full`) VALUES
(5509, 129, '2011-03-12', 320, 420, 0),
(5510, 129, '2011-03-14', 320, 420, 0),
(5511, 129, '2011-03-16', 320, 420, 0),
(5512, 129, '2011-03-18', 320, 420, 0),
(5513, 129, '2011-03-20', 320, 420, 0),
(5514, 129, '2011-03-22', 320, 420, 0),
(5515, 129, '2011-03-24', 320, 420, 0),
(5516, 129, '2011-03-26', 320, 420, 0),
(5517, 129, '2011-03-28', 320, 420, 0),
(5518, 129, '2011-03-30', 320, 420, 0),
(5519, 129, '2011-04-01', 320, 420, 0),
(5520, 129, '2011-04-03', 320, 420, 0),
(5521, 129, '2011-04-05', 320, 420, 0),
(5522, 129, '2011-04-07', 320, 420, 0),
(5523, 129, '2011-04-09', 320, 420, 0),
(5524, 129, '2011-04-11', 320, 420, 0),
(5525, 129, '2011-04-13', 320, 420, 0),
(5526, 129, '2011-04-15', 320, 420, 0),
(5527, 129, '2011-04-17', 320, 420, 0),
(5528, 129, '2011-04-19', 320, 420, 0),
(5529, 129, '2011-04-25', 320, 420, 0),
(5530, 129, '2011-04-27', 320, 420, 0),
(5531, 129, '2011-04-29', 320, 420, 0),
(5532, 129, '2011-05-01', 320, 420, 0),
(5533, 129, '2011-05-03', 320, 420, 0),
(5534, 129, '2011-05-05', 320, 420, 0),
(5535, 129, '2011-05-07', 320, 420, 0),
(5536, 129, '2011-05-09', 320, 420, 0),
(5537, 129, '2011-05-11', 320, 420, 0),
(5538, 129, '2011-05-13', 320, 420, 0),
(5539, 129, '2011-05-15', 320, 420, 0),
(5540, 129, '2011-05-17', 320, 420, 0),
(5541, 129, '2011-05-19', 320, 420, 0),
(5542, 129, '2011-05-21', 320, 420, 0),
(5543, 129, '2011-05-23', 320, 420, 0),
(5544, 129, '2011-05-25', 320, 420, 0),
(5545, 129, '2011-05-27', 320, 420, 0),
(5546, 129, '2011-05-30', 320, 420, 0),
(5547, 130, '2011-03-12', 1060, 1470, 0),
(5548, 130, '2011-03-25', 1060, 1470, 0),
(5549, 130, '2011-04-02', 1060, 1470, 0),
(5550, 130, '2011-04-10', 1060, 1470, 0),
(5551, 130, '2011-04-26', 1060, 1470, 0),
(5552, 130, '2011-05-04', 1060, 1470, 0),
(5553, 130, '2011-05-12', 1060, 1470, 0),
(5554, 130, '2011-05-20', 1060, 1470, 0),
(5555, 130, '2011-05-28', 1060, 1470, 0),
(5646, 134, '2011-03-26', 500, 1000, 0);
Elles sont liées entre elles par sell_nights.sell_offer_id = sell_offers.id

Pour une sell_offers.sell_id donnée, je souhaite récupérer :

- les sell_nights.date MIN et MAX (ça, aucun problème).
- une nouvelle date MAX, calculée en ajoutant à MAX(sell_nights.date) la sell_offers.length MAX (qui est en fait un nombre de jours)

Voici ma requête actuelle :

Code :
1
2
3
SELECT MIN(sell_nights.date) AS min_date, MAX(sell_nights.date) AS max_date, MAX(sell_offers.length) AS max_length, DATE_ADD(max_date, INTERVAL max_length DAY) AS test
FROM sell_nights, sell_offers 
WHERE sell_nights.date >= CURDATE() AND sell_nights.sell_offer_id = sell_offers.id AND sell_offers.sell_id = 65;
Celle-ci fonctionne, elle me récupère le tableau suivant :
Code :
1
2
3
4
5
6
[dates_range] => Array
                (
                    [min_date] => 2011-03-24
                    [max_date] => 2011-05-30
                    [max_length] => 8
                )
Mais si je rajoute
Code :
MAX(DATE_ADD(max_date, INTERVAL max_length DAY)) AS max_end_date
en fin de SELECT, la requête ne me renvoie plus rien.

Une idée de comment récupérer cette fameuse max_end_date, équivalente à max_date + length DAYS ?
van___fanel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 14h09   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Je pense que la requete que vous avez postée n'est pas celle qui fonctionne, mais celle qui ne fonctionne pas

vous ne pouvez pas reprendre les alias pour votre calcul, mais devez faire ainsi :
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT 
	MIN(sell_nights.date) AS min_date, 
	MAX(sell_nights.date) AS max_date, 
	MAX(sell_offers.length) AS max_length, 
	DATE_ADD(MAX(sell_nights.date), INTERVAL MAX(sell_offers.length) DAY) AS test
FROM sell_nights
INNER JOIN sell_offers 
	ON  sell_nights.sell_offer_id = sell_offers.id
WHERE sell_nights.date >= CURDATE() 
	AND sell_offers.sell_id = 65

Cela dit, je pense que vous avez aussi un problème de logique dans votre requête...
Vous prenez d'une part la Date la plus élevée, d'autre part la durée la plus longue...
Lorsque vous ajoutez celle-ci à celle-là, elles n'ont a priori aucun lien entre-elles...

Que cherchez vous a obtenir comme résultat ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 14h22   #3
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 57
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 57
Points : 11
Points : 11
Pour simplifier les choses, on va laisser de côté l'histoire de la date MIN, et focus la date MAX.

disons que j'ai 2 Offres
Offre 1 :
- la date MAX des sell_nights qui lui sont liées est le 03/06/2011.
- la durée du séjour de l'offre est de 2 nuits.
- on a donc une date (de retour) MAX qui vaut 05/06/2011

Offre 2 :
- la date MAX des sell_nights qui lui sont liées est le 01/06/2011.
- la durée du séjour de l'offre est de 7 nuits.
- on a donc une date (de retour) MAX qui vaut 08/06/2011

Grâce à ma requête, j'aimerai que cela soit la date (de retour) de l'offre 2 qui soit sélectionnée, puisque c'est elle la date (de retour) MAX entre les 2.
van___fanel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 14h44   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
pour trouver la date de retour la plus tardive :

Code SQL :
1
2
3
4
5
6
 
SELECT
	MAX(DATE_ADD(sell_nights.date, INTERVAL sell_offers.length DAY) AS MaxDateRetour
FROM sell_nights
INNER JOIN sell_offers 
	ON  sell_nights.sell_offer_id = sell_offers.id
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 15h37   #5
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 57
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 57
Points : 11
Points : 11
Super ! une petite parenthèse manquante, mais ça marche nickel sinon.

Du coup je viens de fusionner cette requête avec la requête pour la date MIN, et c'est parfait, je récupère les bonnes dates :

Code :
SELECT MIN(MIN_NIGHTS.date) AS min_date, MAX(DATE_ADD(MAX_NIGHTS.date, INTERVAL OFFERS_MAX.length DAY)) AS max_date FROM sell_nights MIN_NIGHTS, sell_offers MIN_OFFERS, sell_nights MAX_NIGHTS INNER JOIN sell_offers OFFERS_MAX ON MAX_NIGHTS.sell_offer_id = OFFERS_MAX.id AND OFFERS_MAX.sell_id = 65 WHERE MIN_NIGHTS.date >= CURDATE() AND MIN_NIGHTS.sell_offer_id = MIN_OFFERS.id AND MIN_OFFERS.sell_id = 65 AND MAX_NIGHTS.date >= CURDATE()
qui me renvoie
Code :
1
2
3
4
5
[dates_range] => Array
                (
                    [min_date] => 2011-03-24
                    [max_date] => 2011-06-08
                )
Merci bien.
van___fanel est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h38.


 
 
 
 
Partenaires

Hébergement Web