[英]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.