2010-08-02 24 views
0

J'ai besoin de trouver une méthode rapide et efficace pour interroger MySQL afin d'obtenir des données spécifiques pour chaque jour dans une plage de dates donnée, où la table contient deux colonnes de dates et date de fin.Requête MySQl avancée pour récupérer des enregistrements spécifiques à une date dans la même table

Tableau Exemple: Promotions colonnes:

ID startDate  EndDate  Discount  CategoryID 
============================================================= 
1 2010/08/01 2010/08/10  10.00  A 
2 2010/08/01 2010/08/10  15.00  B 
3 2010/08/11 2010/08/15  05.00  A 
4 2010/08/11 2010/08/15  10.00  B 

Je sais que je peux saisir la promotion de correspondance de la requête suivante lorsque deux plages de dates sont données

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND endDate >= "2010/08/15") AND CategoryID = A 

Le résultat de la requête ci-dessus récupère la ligne avec l'ID 3

Cependant, si les deux plages de dates dans la requête ci-dessus ont été remplacées par quelque chose comme le suivant

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND endDate >= "2010/08/18") AND CategoryID = A 

Je ne reçois aucun résultat adapté, que je peux comprendre la logique ne correspond pas à l'une des données stockées dans la table.

C'est pourquoi, j'ai besoin d'une meilleure solution où je peux obtenir le résultat correspondant même si la date de fin dépasse plus que la date de fin d'une promotion. Cependant changer la logique ne me donnera pas la meilleure réponse, supposons que je puisse obtenir le résultat si j'utilise la requête suivante mais cela ne résout pas non plus tout le problème si j'ai besoin de trouver des remises valides de chaque jour dans la plage de dates .

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND CategoryID = A 

Le résultat vrai que j'ai besoin est un moyen de convertir cette requête en boucle ou en utilisant une table MySQL temporaire dans le memmory pour aller chercher des résultats pour chaque jour comme indiqué ci-dessous.

Résultat Je dois trouver pour la date Range 2010/08/12 à 2010/08/18

=================================================================== 
Date   Discount  
========================= 
2010/08/12  05.00 
2010/08/13  05.00 
2010/08/14  05.00 
2010/08/15  05.00 
2010/08/16  null 
2010/08/18  null 

J'espère que ma question et le problème est bien expliqué et si vous avez besoin d'éclaircissements sur ce problème , s'il vous plaît, faites-moi savoir.

Nous espérons avoir une bonne réponse pour cela.

+0

Vous demandez pour 'endDate> = 2010/08/18', il n'y a pas d'enregistrements qui devraient correspondre, alors quel est le problème? –

+2

C'est un peu flou. Vous voulez trouver, pour un jour donné, les promotions actives ce jour-là? Et puis prolonger cela pour dire "pour tous les jours dans cette gamme, montrez-moi les promotions actives ce jour-là"? –

+0

@Sander le vrai problème ici est de présenter un résultat comme indiqué dans le tableau de résultats final que je cherche, qui peut identifier individuellement le rabais disponible pour chaque jour de la promotion disponible. – Raftalks

Répondre

1

Vous avez besoin d'une table de calendrier des dates qui ressemble à:

Create Table Calendar ([Date] DateTime Not Null Primary Key) 

Ce tableau serait statique et il ne doit être rempli une fois. Il contiendrait une ligne pour chaque jour couvrant toute plage de dates sur laquelle vous souhaitez interroger. Avec cela, votre requête est plus simple:

Select C.Date, P.Discount 
From Calendar As C 
    Left Join Promotions As P 
     On C.Date Between P.StartDate And P.EndDate 
      And P.Category = 'A' 
+0

Je ne suis pas sûr que ce soit une question liée linq? –

+2

@Sander Rijken - Je ne pense pas que le PO ait quelque chose à voir avec LINQ. Dans le quatrième commentaire à l'OP, Raf dit que cela doit être appelé à partir de PHP. – Thomas

+0

Cette approche si absolument bien mais je n'aime pas stocker une table de calendrier statique dans la base de données pour mon projet actuel. – Raftalks

1

Pour interroger les éléments qui se trouvent dans la plage de dates, utilisez:

SELECT * 
FROM Promotions 
WHERE (startDate >= "2010/08/12" AND endDate <= "2010/08/15") 
AND CategoryID = A 

vous voulez la date de début de la valeur est supérieure ou égale, et la date de fin d'être inférieur ou égal.

+0

S'il vous plaît noter que j'ai besoin d'aller chercher le résultat par date comme indiqué dans la question. C'est la partie la plus importante de la question. – Raftalks

+0

Je pense qu'il est préférable de faire cette étape dans un langage qui convient mieux pour le travail? Est-ce que vous essayez de montrer la table qui se trouve à la fin de la question, ou essayez-vous de déterminer s'il y a un rabais un certain jour? –

+0

oui J'essaie de trouver la réduction sur une période de quelques jours à partir d'une période donnée mais je n'aime pas utiliser php pour interroger la base de données pour chaque jour, ce qui n'est pas très rapide. – Raftalks