1

我有一个网站,客户端将事件信息存储到数据库中......真的很简单。

问题是我什么时候想把数据拿出来。我目前可以通过选择所有数据并按月份排序来做到这一点......

我需要的是让它像现在一样显示所有信息,除了它需要通过首先列出当前月份的所有数据然后下个月等等来显示此信息。我不在乎我是否必须简单地以适当的升序每月列出信息,然后让它滚动到当前月份的第一个事件....

目前我的数据库有以下内容。

ID, year, month, day, event_loc, event_address, event_link, event_time, event_name

你可以在这里看到它的作用:

http://www.michael-eubanks.com/events.php

4

3 回答 3

0

也许是这样的 SQL:

select * from <tablename> order by year desc, month desc, day desc

它将首先按年排序数据,然后按月,然后按天,所有这些都按降序排列,因此您应该首先看到最近的事件,依此类推。

于 2013-09-25T04:50:42.880 回答
0

如果我是正确的,你想要的是分组(聚合),所以你需要的只是分组:

SELECT * FROM myTable GROUP BY month ORDER BY month DESC;

我使用降序,首先显示当前月份。

于 2013-09-25T05:01:14.473 回答
0

如果我理解正确并且您只想选择从当月第一天开始的事件,那么您可以这样做

SELECT ID, year, month, day, event_loc, event_address, event_link, event_time, event_name
  FROM events
 WHERE STR_TO_DATE(CONCAT_WS('-', year, month, day), '%Y-%c-%e') >= DATE_FORMAT((CURDATE()), '%Y-%m-01')
 ORDER BY year, month, day

这是SQLFiddle演示


现在,为了能够使用索引和范围搜索正常查询您的数据,我建议您更改表的架构以利用datetime(for event_datecolumn) 和time(for event_duration) 数据类型。建议的架构可能如下所示

CREATE TABLE events
(`ID` int, 
 `event_date`     datetime, 
 `event_loc`      varchar(256), 
 `event_address`  varchar(256), 
 `event_link`     varchar(256), 
 `event_duration` time, 
 `event_name`     varchar(256)
);

然后查询看起来像

SELECT ID, DATE(event_date) event_date, 
       event_loc, 
       event_address, 
       event_link, 
       CONCAT(DATE_FORMAT(event_date, '%l:%i%p - '), 
              DATE_FORMAT(ADDTIME(event_date, event_duration), '%l:%i%p')) event_timee, 
       event_name
  FROM events
 WHERE event_date >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
 ORDER BY event_date

这是SQLFiddle演示

于 2013-09-25T05:18:49.723 回答