Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql按天分组,可统计多种类型的记录_Mysql - Fatal编程技术网

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将永远不会使用索引。