0

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

+---------+---------+------------+-----------+
| 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),我如何返回在某一天创建的列表的数量。本质上,逻辑应该是(伪代码):

  • 从>= min_age 和<= max_agetbl_list_items中选择总记录,并且该列表的记录最旧date_addeddate_added

很难解释我在寻找什么,因此请考虑以下操作:

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

4

5 回答 5

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)可能会更好。

于 2012-11-05T15:36:17.203 回答
0

试试这个:

SELECT count(*) FROM tbl_list_items WHERE date_added >= :min_age and date_added <= :max_age GROUP BY date_added 
于 2012-11-05T15:14:52.167 回答
0

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

表列表
ListID
ListCreatedDate
...任何其他列表信息...

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

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

于 2012-11-05T15:14:52.260 回答
0

这些看起来像 unix 时间戳,在这种情况下,您可以执行类似的操作

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

请注意,这将是低效的,因为您正在比较派生值 - 不会使用索引。

于 2012-11-05T15:18:41.720 回答
0

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

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

或类似的东西。

于 2012-11-05T15:21:13.363 回答