Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 01/08/2011, 16h03   #1
Invité régulier
 
Inscription : octobre 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 21
Points : 6
Points : 6
Par défaut Grosse requête avec tri de date particulier

Bonjour

Je vous avouerais tout d'abord que je n'étais pas très inspiré pour le titre de cette discussion, mais c'est un peu difficile à expliquer en quelques mots.

Voici le problème :

J'ai une table évènements qui contient énoooormement d'entrées, cette table est liée à une autre (en fait plusieurs mais on va faire simple) qui stocke la ou les dates de l'évènement. Un évènement peut avoir une seule date (comprenez jour et horaire) ou plusieurs ou carrément une plage de date (de temps à temps).

Le résultat voulu est un rowset de tous les évènements triés par date, mais pas n'importe comment :

- D'abord les évènements qui ne se déroulent qu'aujourd'hui.
- Ensuite les évènements qui se déroulent sur période incluant le jour actuel.
- Puis les évènement qui se déroulent strictement après la date d'aujourd'hui.

En version simplifié, l'idée serait de faire :

Code :
1
2
3
4
5
SELECT * FROM evenements WHERE date_debut = "aujourd'hui" AND date_fin = "aujourd'hui"
UNION
SELECT * FROM evenements WHERE (date_debut <= "aujourd'hui" AND date_fin > "aujourd'hui") OR (date_debut = "aujourd'hui" AND date_fin >= "aujourd'hui")
UNION
SELECT * FROM evenements WHERE date_debut > "aujourd'hui";
Mais j'imagine que cette méthode est super lourde en ressource (surtout que derrière, je dois gérer un principe de recherche par commune, rubrique, date, mots-clefs, ...).

Je ne sais pas si c'est possible avec une procédure stockée, je suis vraiment novice dans ce domaine et j'ai du mal à voir comment régler ce problème avec.

Des idées, suggestions ?

Merci

PS : Je suis sous un environnement Zend et ai besoin d'un résultat sous forme de rowset pour passer tout ça au paginator.
Lianodel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 16h34   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Vous pouvez mettre un CASE dans votre ORDER BY

Genre :

Code :
1
2
3
4
5
6
7
8
9
10
SELECT 
	MesColonnes 
FROM
	evenements
ORDER BY
	CASE 
		WHEN date_debut = "aujourd'hui" AND date_fin = "aujourd'hui" then 1 
		WHEN (date_debut <= "aujourd'hui" AND date_fin > "aujourd'hui") OR (date_debut = "aujourd'hui" AND date_fin >= "aujourd'hui") THEN 2
		WHEN date_debut > "aujourd'hui" THEN 3
	END ASC
Cependant, plusieurs choses sont étonnantes dans votre regle de gestion.
En effet par exemple, les données recupérées par
Code :
WHERE date_debut = "aujourd'hui" AND date_fin = "aujourd'hui"
le seront aussi via votre 2eme regle de gestion :
Code :
WHERE (date_debut <= "aujourd'hui" AND date_fin > "aujourd'hui") OR (date_debut = "aujourd'hui" AND date_fin >= "aujourd'hui")
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 16h40   #3
Invité régulier
 
Inscription : octobre 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 21
Points : 6
Points : 6
Oops, j'ai supprimé le mauvais caractère

C'est plutôt :

Code :
WHERE (date_debut <= "aujourd'hui" AND date_fin > "aujourd'hui") OR (date_debut < "aujourd'hui" AND date_fin >= "aujourd'hui")
Du coup, on a que des évènement qui ont des dates de début et de fin différentes, ou alors des évènements qui ont la même date mais pas la même que celle du jour.

Sinon pour ce qui est du CASE dans le ORDER BY, je ne connaissais pas ! Je vais essayer ça de ce pas .

Reste à savoir comment faire ça avec la syntaxe Zend...

Merci de cette rapide réponse ^^.
Lianodel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 18h21   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 009
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 009
Points : 18 282
Points : 18 282
Envoyer un message via MSN à CinePhil
Pour dire "aujourd'hui" en SQL, c'est CURRENT_DATE.
Quant à la syntaxe Zend, faites votre requête en SQL natif, ce sera plus simple que le pseudo SQL compliqué en plusieurs morceaux !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 09h02   #5
Invité régulier
 
Inscription : octobre 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 21
Points : 6
Points : 6
A priori, ça fonctionne, je n'ai pas pu déployer cette solution sur le site en ligne pour le moment. Je continue mes tests en dev mais ça semble plutôt bien fonctionner .

Merci à vous.

pour le "aujourd'hui", c'était pour aller plus vite et être plus compréhensible ^^

Pour la syntaxe Zend, ça fonctionne de cette manière :

Code :
1
2
3
4
5
6
7
$tri="CASE 
	WHEN dat.dat_debut = ".$debut." AND dat.dat_fin = ".$fin." then 1 
	WHEN (dat.dat_debut <= ".$debut." AND dat.dat_fin > ".$fin.") OR (dat.dat_debut < ".$debut." AND dat.dat_fin >= ".$fin.") THEN 2
	WHEN dat.dat_debut > ".$fin." THEN 3
END ASC";
 
$select->ORDER($tri);
Lianodel 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 10h01.


 
 
 
 
Partenaires

Hébergement Web