mysql按天分组,可统计多种类型的记录
我有一个带有mysql按天分组,可统计多种类型的记录,mysql,Mysql,我有一个带有id | type | publishedon 类型可以是1、2、3或4(int)值 我想选择每天的帖子 现在我正在使用 SELECT FROM_UNIXTIME( `publishedon` , "%Y-%m-%d" ) AS `day` , count( id ) AS listings, TYPE FROM posts WHERE ( FROM_UNIXTIME( publishedon ) >= SUBDATE( NOW( ) , 30 ) ) GROUP BY `da
id | type | publishedon
类型可以是1、2、3或4(int)值
我想选择每天的帖子
现在我正在使用
SELECT FROM_UNIXTIME( `publishedon` , "%Y-%m-%d" ) AS `day` , count( id ) AS listings,
TYPE FROM posts
WHERE (
FROM_UNIXTIME( publishedon ) >= SUBDATE( NOW( ) , 30 )
)
GROUP BY `day`
结果
day listings
2013-09-02 17
2013-09-05 105
我想把清单归档得更详细,比如
day type_1 type_2 type_3 type_4
2013-09-02 10 4 6 3
2013-09-05 6 4 1 3
您只需将所有
类型
值:
SELECT
FROM_UNIXTIME( `publishedon` , "%Y-%m-%d" ) AS `day`,
count(id) AS listings,
(SELECT COUNT(id) FROM `posts` WHERE `type`=1 AND FROM_UNIXTIME(`publishedon`, "%Y-%m-%d")=`day`) AS `type_1`,
(SELECT COUNT(id) FROM `posts` WHERE `type`=2 AND FROM_UNIXTIME(`publishedon`, "%Y-%m-%d")=`day`) AS `type_2`,
(SELECT COUNT(id) FROM `posts` WHERE `type`=3 AND FROM_UNIXTIME(`publishedon`, "%Y-%m-%d")=`day`) AS `type_3`,
(SELECT COUNT(id) FROM `posts` WHERE `type`=4 AND FROM_UNIXTIME(`publishedon`, "%Y-%m-%d")=`day`) AS `type_4`
FROM
`posts`
WHERE
FROM_UNIXTIME(`publishedon`) >= SUBDATE(NOW(), 30)
GROUP BY
`day`
但事实上,这将工作缓慢,因为有功能的条件。如果这只是一个格式问题,那么最好表现为:
SELECT
FROM_UNIXTIME(`publishedon`, "%Y-%m-%d" ) AS `day`,
`type`,
count( id ) AS listings,
FROM
`posts`
WHERE
-- this should be better evaluated in application
-- since will not produce index using too:
FROM_UNIXTIME(`publishedon`) >= SUBDATE(NOW(), 30)
GROUP BY
`day`,
`type`
然后在应用程序中创建所需的格式。您只需将所有的
类型
值:
SELECT
FROM_UNIXTIME( `publishedon` , "%Y-%m-%d" ) AS `day`,
count(id) AS listings,
(SELECT COUNT(id) FROM `posts` WHERE `type`=1 AND FROM_UNIXTIME(`publishedon`, "%Y-%m-%d")=`day`) AS `type_1`,
(SELECT COUNT(id) FROM `posts` WHERE `type`=2 AND FROM_UNIXTIME(`publishedon`, "%Y-%m-%d")=`day`) AS `type_2`,
(SELECT COUNT(id) FROM `posts` WHERE `type`=3 AND FROM_UNIXTIME(`publishedon`, "%Y-%m-%d")=`day`) AS `type_3`,
(SELECT COUNT(id) FROM `posts` WHERE `type`=4 AND FROM_UNIXTIME(`publishedon`, "%Y-%m-%d")=`day`) AS `type_4`
FROM
`posts`
WHERE
FROM_UNIXTIME(`publishedon`) >= SUBDATE(NOW(), 30)
GROUP BY
`day`
但事实上,这将工作缓慢,因为有功能的条件。如果这只是一个格式问题,那么最好表现为:
SELECT
FROM_UNIXTIME(`publishedon`, "%Y-%m-%d" ) AS `day`,
`type`,
count( id ) AS listings,
FROM
`posts`
WHERE
-- this should be better evaluated in application
-- since will not produce index using too:
FROM_UNIXTIME(`publishedon`) >= SUBDATE(NOW(), 30)
GROUP BY
`day`,
`type`
然后在应用程序内部创建所需的格式。这是什么意思?您是否有替代选项,而不是“FROM_UNIXTIME(
publishedon
)>=SUBDATE(NOW(),30)”是的,我有。在应用程序内部,计算当前时间戳和30天(即30*24*3600秒)的减法。在php中,时间为time()-30*24*3600
,该值为$x。然后您的条件将是:WHERE published don>$x
-这是常量,其中没有函数,因此将使用索引(如果存在),这意味着在WHERE is bad中使用函数在常见情况下并不坏。我的观点是-你可以避免使用它们-你应该这样做,因为如果在相应的条件表达式中有函数,MySQL将永远不会使用索引。你是什么意思?您是否有替代选项,而不是“FROM_UNIXTIME(publishedon
)>=SUBDATE(NOW(),30)”是的,我有。在应用程序内部,计算当前时间戳和30天(即30*24*3600秒)的减法。在php中,时间为time()-30*24*3600
,该值为$x。然后您的条件将是:WHERE published don>$x
-这是常量,其中没有函数,因此将使用索引(如果存在),这意味着在WHERE is bad中使用函数在常见情况下并不坏。我的观点是,您可以避免使用它们,因为如果在相应的条件表达式中有函数,MySQL将永远不会使用索引。