日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

mysql创建表为什么第二次,mysql当我加入同一个表两次聚合是错误的

發布時間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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当我加入同一个表两次聚合是错误的的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。