GROUP BY 結合彙總函數(SUM、COUNT、AVG 等),將資料依指定欄位分組統計。本文說明語法結構、兩個實戰範例(遊戲統計、勝負統計)、PHP 應用寫法。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name
原始資料:
| gameid | best | top | spam |
|---|---|---|---|
| 111 | 1 | 1 | 1 |
| 121 | 1 | 1 | 0 |
| 123 | 0 | 1 | 1 |
| 111 | 1 | 0 | 1 |
查詢:
SELECT gameid,
SUM(best) AS bestcnt,
SUM(top) AS topcnt,
SUM(spam) AS spamcnt
FROM game_table
GROUP BY gameid
結果:
| gameid | bestcnt | topcnt | spamcnt |
|---|---|---|---|
| 111 | 2 | 1 | 2 |
| 121 | 1 | 1 | 0 |
| 123 | 0 | 1 | 1 |
原始資料:
| 日期 | 勝負 |
|---|---|
| 2009-12-09 | 勝 |
| 2009-12-09 | 勝 |
| 2009-12-09 | 負 |
| 2009-12-09 | 負 |
| 2009-12-10 | 負 |
| 2009-12-10 | 勝 |
| 2009-12-10 | 負 |
Oracle/通用寫法(使用 DECODE/CASE):
SELECT 日期,
SUM(CASE WHEN 勝負 = '勝' THEN 1 ELSE 0 END) AS 勝,
SUM(CASE WHEN 勝負 = '負' THEN 1 ELSE 0 END) AS 負
FROM 統計表
GROUP BY 日期
結果:
| 日期 | 勝 | 負 |
|---|---|---|
| 2009-12-09 | 2 | 2 |
| 2009-12-10 | 1 | 2 |
$sql = "SELECT gameid,
SUM(best) AS best,
SUM(top) AS top,
SUM(spam) AS spam
FROM tablename
GROUP BY gameid
ORDER BY gameid ASC";
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)) {
echo "GameID: {$row['gameid']}, Best: {$row['best']}, Top: {$row['top']}, Spam: {$row['spam']}
";
}
HAVING COUNT(*) > 5)