选择MySQL表中最早的记录

时间:2012-11-05 15:11:04

标签: php mysql

请考虑以下表格结构(这是示例数据,因此请忽略时间戳相同):

+---------+---------+------------+-----------+
| list_id | item_id | date_added | is_active |
+---------+---------+------------+-----------+
|    1    |     1   | 1352073600 |     1     |
|    1    |     2   | 1372073600 |     1     |
|    1    |     3   | 1332073600 |     1     |
|    1    |     4   | 1302073600 |     1     |
|    2    |     1   | 1302073600 |     1     |
|    3    |     1   | 1302073600 |     1     |
+---------+---------+------------+-----------+

我们的客户希望显示某一天创建了多少列表。添加第一个项目时会创建列表,但不会显式存储日期,只会添加项目的日期。

我的问题是:

使用MySQL(以及用于计算时间戳的PHP),如何返回在某一天创建的列表数量。本质上,逻辑应该是(伪代码):

  • tbl_list_items中选择date_added> = min_age和date_added< = max_age,并且此列表中记录最早的记录

很难解释我在寻找什么,所以请考虑以下行动:

No items added to lists yet (i.e. all lists have 0 items)
User added `item_id = 1` to `list_id = 1` yesterday.
User added `item_id = 2` to `list_id = 1` today.
User added `item_id = 1` to `list_id = 2` yesterday.
User added `item_id = 1` to `list_id = 3` yesterday.
User added `item_id = 2` to `list_id = 2` today.

如果我们想查看昨天创建了多少列表(或者更确切地说,昨天添加了第一个项目的列表数量),我想返回项目首次添加的总数=昨天。鉴于上面设置的操作,这将返回总共3(即list_id = 1list_id = 2list_id = 3)。

5 个答案:

答案 0 :(得分:1)

这将返回在特定日期创建的列表列表:

SELECT list_id, min(date_added) AS date_creation
FROM tbl_list_items
GROUP BY list_id
HAVING min(date_added) >= @min_age AND min(date_added) <= @max_age

要计算它们,您可以计算查询结果的数量,或使用以下子查询:

SELECT COUNT(*) AS total FROM
(
    SELECT list_id, min(date_added) AS date_creation
    FROM tbl_list_items
    GROUP BY list_id
    HAVING min(date_added) >= @min_age AND min(date_added) <= @max_age
)

但请注意,这完全没有优化,因为每个查询都必须为整个表GROUP BY;当添加列表的第一项时,可能会更好地添加标志(creation = 0 | 1)。

答案 1 :(得分:0)

试试这个:

SELECT count(*) FROM tbl_list_items WHERE date_added >= :min_age and date_added <= :max_age GROUP BY date_added 

答案 2 :(得分:0)

您应该有多个表来规范化数据。一个用于列表,另一个用于列表项。

表格列表
ListID
ListCreatedDate
......任何其他清单信息......

Table ListItem
ListID
ListItemID
ListItemCreatedDate
......任何其他列表项信息......

这样您就可以访问列表创建日期以及单个项目日期。然后,您只需加入List.ListID = ListItem.ListID即可获取所有信息。

答案 3 :(得分:0)

那些看起来像unix时间戳,在这种情况下你可以做类似

的事情
SELECT ..
FROM ...
WHERE DATE(FROM_UNIXTIME(date_added)) = '2012-11-03'

请注意,这样效率很低,因为您要比较派生值 - 不会使用索引。

答案 4 :(得分:0)

如果您想从某一天选择记录,为什么要指定min_agemax_age?您只需要比较一个日期(例如,格式为YYYY-MM-DD):

select count(*) from table_name where from_unixtime(date_added, %Y-%m-%d) = $date group by list_id

或类似的东西。