2010-08-02 4 views
0

Мне нужно найти лучший и быстрый способ запроса таблицы MySQL для получения конкретных данных за каждый день в заданном диапазоне дат, где в таблице есть два столбца даты, указывающие начало и дата окончания.Продвинутый запрос MySQl для получения конкретных записей по дате в одной таблице

Таблица Пример: Акции колонки:

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 

Я знаю, что могу захватить продвижение соответствия в следующем запросе, когда два диапазона дат приведены

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

Результат для вышеупомянутого запроса будет введите строку с ID 3

Однако, если два диапазона дат в вышеуказанном запросе были изменены на следующее:

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

Я не получаю никакого согласованного результата, так как я понимаю, что логика не соответствует ни одной из сохраненных данных в таблице.

Вот почему мне нужно лучшее решение, в котором я могу получить результат, даже если дата окончания превышает дату окончания акции. Однако изменение логики не даст мне лучшего ответа, предположим, что я смогу получить результат, если я воспользуюсь следующим запросом, но это также не решает всей проблемы, если мне нужно найти скидки, действующие каждый день в диапазоне дат ,

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

Истинный результат мне нужен способ, чтобы преобразовать этот запрос в петлю или используя временную таблицу MySQL в Memmory, чтобы получить результаты за каждый день, как указано ниже.

Результат мне нужно найти для Диапазон дат 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 

Я надеюсь, что мой вопрос и проблема хорошо объясняется и если вам нужны какие-либо дополнительные разъяснения относительно этой проблемы , пожалуйста, дай мне знать.

Надеемся увидеть отличный ответ для этого.

+0

Вы запрашивая 'ENDDATE> = 2010/08/18', нет записей, которые должны соответствуют, так в чем проблема? –

+2

Это немного неясно. Вы хотите найти в течение определенного дня акции, активные в этот день? И затем расширьте это, чтобы сказать «на все дни в этом диапазоне, показать мне акции, активные в этот день»? –

+0

@ Попробуйте настоящую проблему, чтобы представить результат таким образом, как показано в таблице конечных результатов, которую я ищу, которая может индивидуально идентифицировать скидку, доступную для каждого дня, из доступных рекламных акций. – Raftalks

ответ

1

Вы должны календарную таблицу дат, которая выглядит примерно так:

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

Эта таблица будет статичной и нужно будет заселен только один раз. Он будет содержать одну строку для каждого дня, охватывая любой диапазон дат, на который вы хотите запросить. При том, что ваш запрос проще:

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

Я не уверен, что это вопрос, связанный с linq? –

+2

@Sander Rijken - Я не думаю, что OP имеет какое-то отношение к LINQ. В четвертом комментарии к OP, Raf говорит, что это нужно вызывать из PHP. – Thomas

+0

Этот подход, если он абсолютно прав, однако мне не нравится хранить статическую таблицу календаря в базе данных для моего текущего проекта. – Raftalks

1

Для запроса для элементов, которые находятся в диапазоне дат, используйте:

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

вы хотите дату начала быть больше или равно, и конечную дату, чтобы быть меньше или равно.

+0

Обратите внимание, что мне нужно получить результат по дате, указанный в вопросе. Это самая важная часть вопроса. – Raftalks

+0

Я думаю, что лучше сделать этот шаг на языке, который больше подходит для работы? Вы пытаетесь показать таблицу, которая находится в конце вопроса, или вы пытаетесь определить, есть ли скидка на определенный день? –

+0

да Я пытаюсь найти скидку на период дней с определенного диапазона дат, но не люблю использовать php для запроса базы данных каждый день, что не очень быстро. – Raftalks