Php MySQL单次查询,可对多个日期范围内的行进行计数

Php MySQL单次查询,可对多个日期范围内的行进行计数,php,mysql,date,Php,Mysql,Date,我必须从mysql表中计算几个日期范围(今天、周、月)的行数 目前,我正在PHP脚本中运行一个循环,并对每个日期范围进行单独的查询,我知道这是个坏主意 <?php $now = "2016-04-21"; $today = $now; $week = date( 'Y-m-d', strtotime( '-7 day', strtotime( $now ) ) ); $month = substr( $now, 0, 7 ); $res1 = mysql_query("SELECT SU

我必须从mysql表中计算几个日期范围(今天、周、月)的行数

目前,我正在PHP脚本中运行一个循环,并对每个日期范围进行单独的查询,我知道这是个坏主意

<?php
$now = "2016-04-21";
$today = $now;
$week = date( 'Y-m-d', strtotime( '-7 day', strtotime( $now ) ) );
$month = substr( $now, 0, 7 );

$res1 = mysql_query("SELECT SUM(pageview) FROM statistics WHERE user = '$id' AND DATE_FORMAT( date, '%Y-%m-%d' ) = '$today'" );
$res2 = mysql_query("SELECT SUM(pageview) FROM statistics WHERE user = '$id' AND ( t.date BETWEEN ( '$week' ) AND ( '$today' ) )");
$res3 = mysql_query("SELECT SUM(pageview) FROM statistics WHERE user = '$id' AND DATE_FORMAT( t.date, '%Y-%m' ) = '$month'" );
是否使用联合体

Select a from B
Union
Select B from C
...
使用联合体

Select a from B
Union
Select B from C
...

如果确实要使用一个查询检索三个值:

$res = mysql_query("
SELECT sum1, sum2, sum3 
FROM (SELECT SUM(pageview) AS sum1 FROM statistics WHERE user = '$id' AND DATE_FORMAT( date, '%Y-%m-%d' ) = '$today') AS T1
JOIN (SELECT SUM(pageview) AS sum2 FROM statistics WHERE user = '$id' AND ( t.date BETWEEN ( '$week' ) AND ( '$today' ) )) AS T2
JOIN (SELECT SUM(pageview) AS sum3 FROM statistics WHERE user = '$id' AND DATE_FORMAT( t.date, '%Y-%m' ) = '$month') AS T3");
虽然这在性能方面并没有太大的改进,但我真的不认为有理由这样做


另外,像这样在查询中插入变量是一个坏习惯。在这种情况下,您的安全性很高,但是如果您使用用户输入的变量,那么您就可以接受SQL注入。如果确实要使用一个查询检索三个值,请尝试学习:

$res = mysql_query("
SELECT sum1, sum2, sum3 
FROM (SELECT SUM(pageview) AS sum1 FROM statistics WHERE user = '$id' AND DATE_FORMAT( date, '%Y-%m-%d' ) = '$today') AS T1
JOIN (SELECT SUM(pageview) AS sum2 FROM statistics WHERE user = '$id' AND ( t.date BETWEEN ( '$week' ) AND ( '$today' ) )) AS T2
JOIN (SELECT SUM(pageview) AS sum3 FROM statistics WHERE user = '$id' AND DATE_FORMAT( t.date, '%Y-%m' ) = '$month') AS T3");
虽然这在性能方面并没有太大的改进,但我真的不认为有理由这样做


另外,像这样在查询中插入变量是一个坏习惯。在这种情况下,您的安全性很高,但是如果您使用用户输入的变量,那么您就可以接受SQL注入。尝试学习

您可以通过
组合所有条件,在一个查询中选择所有数据。这种结构可以用在
SELECT
中,对满足某些条件的行求和

SUM(如果(条件,SUM\u列\u名称,0))
如果要返回一行三个和,查询可以如下所示

选择
求和(如果(t.date='$today',pageview,0))作为今天的页面视图_,
总和(如果(t.日期介于“$week”和“$today”,页面浏览,0))作为页面浏览量_week,
总和(如果(日期格式(t.DATE,%Y-%m')='$month',pageview,0))作为pageview\u月
来自统计t
其中user='$id'和(
t、 日期=“$today”
或(t.日期介于“$week”和“$today”之间)
或日期格式(t.DATE,'%Y-%m')='$month'
)

或者您可以进行3次查询,并将它们与@quazardous提到的
UNION
组合。此方法将为您提供3个不同的行。

您可以通过
组合所有条件,在一个查询中选择所有数据。这种结构可以用在
SELECT
中,对满足某些条件的行求和

SUM(如果(条件,SUM\u列\u名称,0))
如果要返回一行三个和,查询可以如下所示

选择
求和(如果(t.date='$today',pageview,0))作为今天的页面视图_,
总和(如果(t.日期介于“$week”和“$today”,页面浏览,0))作为页面浏览量_week,
总和(如果(日期格式(t.DATE,%Y-%m')='$month',pageview,0))作为pageview\u月
来自统计t
其中user='$id'和(
t、 日期=“$today”
或(t.日期介于“$week”和“$today”之间)
或日期格式(t.DATE,'%Y-%m')='$month'
)

或者您可以进行3次查询,并将它们与@quazardous提到的
UNION
组合。这个方法会给你3个不同的行。

你能解释一下表的结构吗?你有什么专栏?表中有4列“id int(10)autoincrement primary”、“date date”、“user varchar(32)index”和“pageview int(10)”。pageview中存储的是每日PageViews的总数好的,因此每一行都是一个具有多个页面视图的用户,您可能会有很多这样的行,然后您要计算在过去的一个月、过去的一周和过去的一天中您有多少个页面视图,对吗?另外,您提到您目前正在进行循环。您的意思是要将用户的页面视图逐个添加到一起吗?您能稍微解释一下表的结构吗?你有什么专栏?表中有4列“id int(10)autoincrement primary”、“date date”、“user varchar(32)index”和“pageview int(10)”。pageview中存储的是每日PageViews的总数好的,因此每一行都是一个具有多个页面视图的用户,您可能会有很多这样的行,然后您要计算在过去的一个月、过去的一周和过去的一天中您有多少个页面视图,对吗?另外,您提到您目前正在进行循环。您的意思是要将用户的页面浏览量逐个添加到一起吗?不是,因为我需要三个单独的结果:今天、每周和每月。在这种情况下,您可以在一个查询中完成,但也可以在三个查询中完成。我认为这在代码方面要干净得多,如果只使用一个queryno,你不会获得太多的效率,因为我需要三个单独的结果:今天、每周和每月。在这种情况下,你可以在一个查询中完成,但也可以在三个查询中完成。我认为这在代码方面要干净得多,而通过一次查询并不能获得多大的效率