簡體   English   中英

MySQL單一查詢可對多個日期范圍內的行進行計數

[英]MySQL single query to count rows in multiple date ranges

我必須從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'" );

因此,我想使用單查詢。

我發現了多個日期范圍內的計數行,查詢了 多個日期范圍的 查詢,但是我不確定哪個是最好的,以及如何處理我的情況

如果您真的想使用一個查詢來檢索三個值:

$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");

盡管這並不是更好的性能選擇,但我真的沒有理由這樣做。

PS:將變量插入這樣的查詢中是一個壞習慣。 在這種情況下,您可以放心使用,但如果使用用戶輸入的變量,則可以進行SQL注入。 嘗試學習准備好的陳述

您可以按OR組合所有條件,以在一個查詢中選擇所有數據。 並且此構造可用於SELECT中以求和滿足某些條件的行

SUM(IF(condition, sum_column_name, 0))

如果您想返回一行包含三筆總和的查詢,則查詢看起來像這樣

SELECT
  SUM(IF(t.date = '$today', pageview, 0)) AS pageview_today,
  SUM(IF(t.date BETWEEN '$week' AND '$today', pageview, 0)) AS pageview_week,
  SUM(IF(DATE_FORMAT(t.date, '%Y-%m') = '$month', pageview, 0)) AS pageview_month
FROM statistics t
WHERE user = '$id' AND (
  t.date = '$today'
  OR (t.date BETWEEN '$week' AND '$today')
  OR DATE_FORMAT(t.date, '%Y-%m') = '$month'
)

或者,您可以進行3個查詢,並將它們與UNION結合使用,如@quazardous所述。 並且此方法將為您提供3個不同的行。

使用聯盟?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM