Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Выборка по дате


Автор: MrDmitry 27.6.2011, 12:19
Здравствуйте уважаемые форумчане. Помогите составитm sql запрос следующего характера

Делаю не большой интернет магазин. Нужно выбрать пользователей которые совершили операции за апрель месяц этого года более 2 раз

Таблица выглядит так

id (int)
user (varchar)
type (varchar)
date (int)
sum (int)
brand_id (int)

Дата хранится в UNIX формате (Записывается на php через time() ) База данных MySql

Сделал так

Код

SELECT user,  DATE_FORMAT(FROM_UNIXTIME(date),'%m%y') as date, 
      type FROM dp_operation where date in
      (select date from dp_operation 
       group by date having count(date)>1)


То есть вроде как sql запрос составлен верно. Но нет сравнения с датой, есть только выборка по кол-во совпадений дат. А как отобрать именно за Апрель?



Автор: Akina 27.6.2011, 12:29
Цитата(MrDmitry @  27.6.2011,  13:19 Найти цитируемый пост)
вроде как sql запрос составлен верно

Последнее слово - лишнее.
Код

select `user` 
from `dp_operation`
where month(`date`) = 4 and year(`date`) = 2011
group by `user`
having count(`user`) > 1


Выбор формы условия отбора из десятка возможных зависит от имеющихся индексов и (главным образом) критичности выполнения по скорости.

Автор: MrDmitry 27.6.2011, 14:15
Спасибо работает. Но не полностью. Почему то sql запрос 
Код

year(`date`) = 2011


Дает пустой результат хотя в базе данных есть  1304051029 что равно 29.04.11

Автор: Akina 27.6.2011, 14:26
Цитата(MrDmitry @  27.6.2011,  15:15 Найти цитируемый пост)
Дает пустой результат хотя в базе данных есть  1304051029 

Кто-то говорил, что
Цитата(MrDmitry @  27.6.2011,  13:19 Найти цитируемый пост)
Дата хранится в UNIX формате 

Так вот - не верю. Ну хотя бы потому, что такого типа в MySQL тупо нет. Покажите create table.
 
Ну или для самостоятельного разбора:

Код

mysql> create table test(val long);
Query OK, 0 rows affected (0.11 sec)

mysql> insert into test values(1304051029);
Query OK, 1 row affected (0.05 sec)

mysql> select FROM_UNIXTIME(val) from test;
+---------------------+
| FROM_UNIXTIME(val)  |
+---------------------+
| 2011-04-29 08:23:49 |
+---------------------+
1 row in set (0.00 sec)

mysql> select FROM_UNIXTIME(val) from test where year(val)=2011;
Empty set (0.01 sec)

mysql> select FROM_UNIXTIME(val) from test where year(FROM_UNIXTIME(val))=2011;
+---------------------+
| FROM_UNIXTIME(val)  |
+---------------------+
| 2011-04-29 08:23:49 |
+---------------------+
1 row in set (0.00 sec)

Автор: MrDmitry 27.6.2011, 14:46
Большое спасибо. Разобрался.

Автор: Akina 27.6.2011, 15:12
MrDmitry
да! чтобы всё это не тормозило безбожно, лучше поступите наоборот, и издевайтесь над константами, а не над полями:
Код

WHERE val BETWEEN UNIX_TIMESTAMP('2011-04-01 00:00:00') AND UNIX_TIMESTAMP('2011-04-30 23:59:59')

В этом случае при отборе будет использоваться индекс по val.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)