mysql创建表为什么第二次,mysql当我加入同一个表两次聚合是错误的
我基本上有一個表可以保存每個日期的計數.我想創建一個查詢,它給出了整個表的總計數,以及昨天的總計數.但是當我嘗試兩次加入表時,聚合關閉了.以下是如何復制結果的方法.
CREATE TABLE a (id int primary key);
CREATE TABLE b (a_id int,b_id int,date date,count int,primary key (a_id,b_id,date));
INSERT INTO a VALUES (1);
INSERT INTO b VALUES (1,1,UTC_DATE(),5);
INSERT INTO b VALUES (1,2,10);
INSERT INTO b VALUES (1,UTC_DATE()-1,7);
INSERT INTO b VALUES (1,12);
SELECT A.id,SUM(B.count) AS total_count,SUM(Y.count) AS y FROM a AS A
LEFT JOIN b AS B ON (B.a_id=A.id)
LEFT JOIN b AS Y ON (Y.a_id=A.id AND Y.date=UTC_DATE()-1)
GROUP BY A.id;
Results in:
+----+-------------+------+
| id | total_count | y |
+----+-------------+------+
| 1 | 68 | 76 |
+----+-------------+------+
The correct result should be:
+----+-------------+------+
| id | total_count | y |
+----+-------------+------+
| 1 | 34 | 22 |
+----+-------------+------+
這里發生了什么?這是mysql中的錯誤還是我不明白聯接是如何工作的.
最佳答案
不,這不是MySQL中的錯誤.
您的JOIN條件正在生成“重復”行. (刪除聚合函數和GROUP BY,你會看到發生了什么.
表“a”中的那一行與表“b”中的四行匹配.這一切都很好,很好.但是當您將連接添加到第三個表(“y”)時,從第三個“y”表(兩行)返回的每一行都與“b”表中的每一行“匹配”…所以你風結果集中總共有八行. (這就是“total_count”增加一倍的原因.)
要獲取您指定的結果集,您不需要第二次加入該表“b”.相反,只需使用條件測試來確定“計數”是否應該包含在“y”總數中.
例如
SELECT a.id,SUM(b.count) AS total_count,SUM(IF(b.date=UTC_DATE()-1,b.count,0)) AS y
FROM a a
LEFT
JOIN b b ON (b.a_id=a.id)
GROUP BY a.id;
請注意,MySQL IF表達式可以替換為等效的ANSI CASE表達式,以提高可移植性:
,SUM(CASE WHEN b.date=UTC_DATE()-1 THEN b.count ELSE 0 END) AS y
如果你確實想第二次聯接到那個“b”表,你會希望JOIN條件是這樣的,“y”中的一行最多匹配“b”中的一行,以免介紹任何重復.所以你基本上需要連接條件來包含主鍵中的所有列.
(請注意,表“y”的連接條件中的謂詞保證每個來自“y”的匹配不會超過“b”中的一行):
SELECT a.id,SUM(y.count) AS y
FROM a a
LEFT
JOIN b b
ON b.a_id=a.id
LEFT
JOIN b y
ON y.a_id = b.a_id
AND y.b_id = b.b_id
AND y.date = b.date
AND y.date = UTC_DATE()-1
GROUP BY a.id;
(要獲得返回相同結果集的第一個語句,使用潛在的NULL代替零,您需要將IF表達式中的’0’常量替換為’NULL’.
,NULL)) AS y
【免責聲明】本站內容轉載自互聯網,其相關言論僅代表作者個人觀點絕非權威,不代表本站立場。如您發現內容存在版權問題,請提交相關鏈接至郵箱:bqsm@foxmail.com,我們將及時予以處理。
總結
以上是生活随笔為你收集整理的mysql创建表为什么第二次,mysql当我加入同一个表两次聚合是错误的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php yii orm,Yii中的sql
- 下一篇: php禁止网页抓取,服务器反爬虫攻略:A