MySQL выбирает недельный диапазон из базы данных

В моей базе данных я храню номера недель и соответствующие годы. Например что-то вроде этого:

id | week | year | text
---+------+------+-----------
 1 |  23  | 2012 | hello
 2 |  27  | 2012 | something
 3 |  39  | 2012 | more text
 4 |  43  | 2012 | more text

Затем в интерфейсе пользователь может выбрать неделю и год, и затем я хочу иметь возможность вернуть все записи между этим диапазоном. Например, выбор между неделей 25-2012 и неделей 50-2012 вернет последние 3 записи.

Я не уверен, будет ли проще также удерживать первую дату недели и искать по ней, или есть способ легко искать по неделям.

Заранее спасибо.


person Sean    schedule 01.02.2013    source источник
comment
... WHERE (year = 2012) AND (week BETWEEN 25 AND 50). Однако это не сработает, если вы разрешите диапазону запроса охватывать разные годы.   -  person Marc B    schedule 01.02.2013


Ответы (3)


Предположительно, вам нужны недели подряд, даже если год другой. В этом поможет некоторая арифметика:

select text
from dates
where year*100 + week between $weekmin+$yearmin*100 and $weekmax+$yearmax*100 

Это преобразует, скажем, неделю 7 в 2012 году в «201207» для целей сравнения.

person Gordon Linoff    schedule 01.02.2013
comment
Вау, проще, чем я думал. +1 за это :) - person Tomáš Zato - Reinstate Monica; 01.02.2013
comment
@палиндром . . . да. Хороший улов. Кажется, я удалил это где-то по пути. - person Gordon Linoff; 01.02.2013
comment
Я бы никогда не подумал об этом даже через миллион лет. Очень умный и отлично работает. Большое спасибо. - person Sean; 01.02.2013

Так как MySQL поддерживает операторы сравнения, эта задача очень проста. :

SELECT text FROM `dates` WHERE week>=$weekmin AND week<=$weekmax AND year>=$yearmin AND year<=$yearmax ORDER BY year DESC, month DESC
person Tomáš Zato - Reinstate Monica    schedule 01.02.2013
comment
Спасибо за оба ваших ответа, но мне нужно иметь возможность охватывать несколько лет, и это проблема, с которой я столкнулся, и не могу обойти ее. - person Sean; 01.02.2013
comment
Ах да, я не подумал об этом в первый раз. Мне понадобится минута, чтобы понять это. Но использование временной метки DATE или UNIX вместо двух целых избавит вас от этой проблемы. - person Tomáš Zato - Reinstate Monica; 01.02.2013

SELECT * 
FROM yourtable
WHERE week >= User_input1_week
AND week <= User_input2_week
AND year >= User_input1_year
AND year <= user_input2_year

Это, вероятно, сработает.

Я не уверен, будет ли проще также удерживать первую дату недели и искать по ней, или есть способ легко искать по неделям.

Использование типа DATE для вашего столбца, вероятно, было бы лучшим шагом.

person Floris Velleman    schedule 01.02.2013