继明 发表于 2023-9-14 12:06:19

MySQL LEFT JOIN与GROUP BY和WHERE IN(子查询)

我有一张表,每个日期都有一些统计信息,我想用MySQL列出。对于某些日期,将没有统计信息,因此结果应与以下内容相似:
2013-03-01:3
2013-03-02:2
2013-03-03:0
2013-03-04:1
我发现我可以用一个单独的表(包括所有可能的日期和LEFT JOIN)来解决用0-零-填补空白的问题。到目前为止,一切都很好。
统计信息(显示次数)campaigndata”表中:
id-int(11)日期-日期campaignid-int(11)印象数-int(11)但我只想得到一些统计信息。更具体地说,我只想来自 campaigndata campaignid”位于表“
campaignfilter”中,并且“ campaigntype设置为1(例如)。
这是表“ campaignfilter”:
id-int(11)campaigntype-int(11)campaignid-int(11)每个人都知道如何做到这一点?
PS:“ campaigndata由于它是基于从外部系统自动导入的结构,表的结构已被锁定。
样本记录
CREATE TABLE demo_campaigndata (id int(11) NOT NULL AUTO_INCREMENT, date date NOT NULL, campaignid int(11) NOT NULL, impressions int(11) NOT NULL, PRIMARY KEY (id));INSERT INTO demo_campaigndata (id,date,campaignid,impressions) VALUES(1,'2013-03-03,1,100),(2,2,2013-03-03,2,100),(3,2013-03-2013-03-04,2,100),(5,2013-03-(6)-03-05',2,100);CREATE TABLE demo_campaignfilter (id int(11) NOT NULL AUTO_INCREMENT,    campaigntype int(11) NOT NULL, campaignid int(11) NOT NULL, PRIMARY KEY (id));INSERT INTO demo_campaignfilter (id,campaigntype,campaignid) VALUES(1,1,1),(2,1,3);CREATE TABLE demo_calendar (date date NOT NULL, PRIMARY KEY (date));INSERT INTO demo_calendar (date) VALUES('2013-03-01'),('2013-03-02'),('2013-03-03'),('2013-03-04'),('2013-03-05');期望的结果
2013-03-01: 02013-03-02: 02013-03-03: 2002013-03-04: 02013-03-5:100               
    解决方案:                                                               
                                                                SELECTa.date,COUNT(b.campaignid) totalStat
                FROM    campaigndata a
                                                LEFT JOIN campaignfilter b
                                                                ONa.campaignid = b.campaignid AND
                                                                              b.campaigntype = 1
                GROUP   BY a.date
为进一步获取相关知识,请访问以下链接:
SQL可视表示连接更新1
SELECTa.date,      COALESCE(b.totals,0) totalsFROM    demo_calendar a      LEFT JOIN    SELECTa.date,SUM(impressions) totals            FROM    demo_campaigndata a                  INNER JOIN demo_campaignfilter b                        ON a.campaignid = b.campaignid            WHERE   b.campaigntype =            GROUP   BY a.date       b ON a.date = b.date
页: [1]
查看完整版本: MySQL LEFT JOIN与GROUP BY和WHERE IN(子查询)