我正在使用PHP访问MySQL数据库。我有一个像这样构建的表:
表头:
表内容:
该表显示了网站访问者在何时调用了哪些profileid。
所以现在我的问题是,如何显示例如:“给我12/22/2017上调用的配置文件号12345678的条目数”,在这种情况下为“2”。
我用这个查询尝试过:
SELECT COUNT(profileid), from_unixtime(timestamp, '%d') AS day, from_unixtime(timestamp, '%m') as month, from_unixtime(timestamp, '%Y') as year WHERE profileid='12345678' AND day=22 AND month=12 AND year=2017;
但是不可能访问“day”,“month”和“year”列,因为它们不存在于表中。
有人可以给我一个提示怎么做?另一种方法是创建三个新列(时间戳日,时间戳月和时间戳年),但这不是一个好的解决方案。
先感谢您!
做
只需生成日期。我想你想要:
SELECT COUNT(profileid)
FROM t
WHERE DATE(from_unixtime(timestamp)) = '2017-12-22' AND
profileid = '12345678';
我更倾向于把它写成:
SELECT COUNT(profileid)
FROM t
WHERE profileid = '12345678' AND
timestamp >= UNIX_TIMESTAMP('2017-12-22') AND
timestamp < UNIX_TIMETAMP('2017-12-23');
这允许查询充分利用t(profileid, timestamp)
上的索引。
你可以使用MySQL DAY,MONTH和YEAR函数与FROM_UNIXTIME结合使用。
SELECT COUNT(profileid)
WHERE profileid='12345678'
AND DAY(FROM_UNIXTIME(timestamp))=22
AND MONTH(FROM_UNIXTIME(timestamp))=12
AND YEAR(FROM_UNIXTIME(timestamp))=2017;
这里有一些事情。
TIMESTAMP
将原始时间戳转换为MySQL FROM_UNIXTIME(timestamp)
对象。你已经知道了。TIMESTAMP
,你可以使用它上面的各种日期函数。UNIX_TIMESTAMP()
转换另一个方向所以你的查询应该是
SELECT COUNT(*) cnt
FROM t
WHERE profileid = '12345678'
AND timestamp >= UNIX_TIMESTAMP('2017-12-22')
AND timestamp < UNIX_TIMESTAMP('2017-12-23')
这将在您想要的那天获取每个时间戳值,但不包括第二天的午夜。如果你在(profileid, timestamp)
上有一个索引,那么这种查询会很快。
请注意,您也可以这样做
SELECT COUNT(*) cnt, profileid
FROM t
WHERE timestamp >= UNIX_TIMESTAMP('2017-12-22')
AND timestamp < UNIX_TIMESTAMP('2017-12-23')
GROUP BY profileid
并获得一个结果集,显示当天所有配置文件ID的计数。而且,你可以做到
SELECT COUNT(*) cnt, profileid, DATE(FROM_UNIXTIME(timestamp)) day
FROM t
WHERE timestamp >= UNIX_TIMESTAMP('2017-11-01')
AND timestamp < UNIX_TIMESTAMP('2017-12-01')
GROUP BY profileid, DATE(FROM_UNIXTIME(timestamp))
并获得11月的一切。
你可以这样做
SELECT COUNT(*) cnt, profileid, LAST_DAY(FROM_UNIXTIME(timestamp)) month_ending
FROM t
WHERE timestamp >= UNIX_TIMESTAMP('2017-01-01')
AND timestamp < UNIX_TIMESTAMP('2018-01-01')
GROUP BY profileid, LAST_DAY(FROM_UNIXTIME(timestamp))
并获得一整年的逐月摘要。
日期算术很有用。这就是为什么许多表设计使用类似DATETIME
和TIMESTAMP
的实际类似日期戳的字段,而不是原始整数时间戳。