请考虑以下表格结构(这是示例数据,因此请忽略时间戳相同):
+---------+---------+------------+-----------+
| 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 = 1
,list_id = 2
和list_id = 3
)。
答案 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_age
和max_age
?您只需要比较一个日期(例如,格式为YYYY-MM-DD):
select count(*) from table_name where from_unixtime(date_added, %Y-%m-%d) = $date group by list_id
或类似的东西。