回答

收藏

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

技术问答 技术问答 151 人阅读 | 0 人回复 | 2023-09-14

我有一张表,每个日期都有一些统计信息,我想用MySQL列出。对于某些日期,将没有统计信息,因此结果应与以下内容相似:
1 h/ T0 r- i. H4 i' M2013-03-01:3! M- R) T/ {6 G& g7 q: N5 X+ j& W
2013-03-02:2
" M2 v; Z3 }- O2013-03-03:0
! ]0 h& P7 O* @% z# K) Z) t7 j; e' i2013-03-04:1
$ c' D+ k  u* t; w1 @我发现我可以用一个单独的表(包括所有可能的日期和LEFT JOIN)来解决用0-零-填补空白的问题。到目前为止,一切都很好。: {) ~: Y# h6 V& `! {* M4 P
统计信息(显示次数)campaigndata”表中:
3 s7 T# v9 H2 q- x' P) L1 I& h+ kid-int(11)日期-日期campaignid-int(11)印象数-int(11)但我只想得到一些统计信息。更具体地说,我只想来自 campaigndata campaignid”位于表“( j0 T6 t, x) c! f, U
campaignfilter”中,并且“ campaigntype设置为1(例如)。
" |) _6 ?6 j5 {, w- a4 t2 }7 A6 V- k这是表“ campaignfilter”:2 X  _' T! t( o
id-int(11)campaigntype-int(11)campaignid-int(11)每个人都知道如何做到这一点?
/ M$ F# Y0 T  \/ \PS:“ campaigndata由于它是基于从外部系统自动导入的结构,表的结构已被锁定。6 _4 ]  P6 j4 A* m& o. c. _: j
样本记录
* K& q! K7 H6 Z* _% vCREATE 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');期望的结果+ s9 a( n, t6 b# z  {$ a7 f- l
2013-03-01: 02013-03-02: 02013-03-03: 2002013-03-04: 02013-03-5:100               & ~: j$ Q! _# ]& q- Y8 E
    解决方案:                                                                3 c$ V1 F5 R/ K  ^
                                                                SELECT  a.date,COUNT(b.campaignid) totalStat
) A7 @) B" X2 l- _, J) _                FROM    campaigndata a2 ^7 Y1 n) Q# q: m1 D
                                                LEFT JOIN campaignfilter b
5 M& _* o# E' K1 z                                                                ON  a.campaignid = b.campaignid AND
' p( Q" z: W) v3 L                                                                                b.campaigntype = 1: S4 i+ x2 b: W1 m* y8 u
                GROUP   BY a.date
8 W+ ~5 i: _& n) P6 d为进一步获取相关知识,请访问以下链接:
* v- B: k( z- j! J  z) f: KSQL可视表示连接更新11 t. x  r  F% V; `8 c7 u
SELECT  a.date,        COALESCE(b.totals,0) totalsFROM    demo_calendar a        LEFT JOIN    SELECT  a.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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则