回答

收藏

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

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

我有一张表,每个日期都有一些统计信息,我想用MySQL列出。对于某些日期,将没有统计信息,因此结果应与以下内容相似:
4 q/ Y5 H9 _) \3 d9 V- V) Q3 I2013-03-01:3
9 r! O1 M$ Y- Q7 |1 V; d2013-03-02:2
( o8 }: k1 T' F' @1 u2013-03-03:0
4 ^. C" Q' U2 [) N, K- T2013-03-04:1
! w9 A0 _& ]% O; K我发现我可以用一个单独的表(包括所有可能的日期和LEFT JOIN)来解决用0-零-填补空白的问题。到目前为止,一切都很好。
% @; J2 D0 \6 T统计信息(显示次数)campaigndata”表中:
8 R( e" l/ r9 p8 N9 K8 Mid-int(11)日期-日期campaignid-int(11)印象数-int(11)但我只想得到一些统计信息。更具体地说,我只想来自 campaigndata campaignid”位于表“
% ?3 r5 ~* o- T. T8 b9 y2 Ncampaignfilter”中,并且“ campaigntype设置为1(例如)。
7 L4 e& ]. d3 s: O9 B- i- E9 s. z3 T. C这是表“ campaignfilter”:3 h: z+ o  `# s' |$ B  y4 u# V  e
id-int(11)campaigntype-int(11)campaignid-int(11)每个人都知道如何做到这一点?
5 F* i) e# E1 p9 X' bPS:“ campaigndata由于它是基于从外部系统自动导入的结构,表的结构已被锁定。
/ x4 o6 c. v- Y样本记录% _( {4 M' b2 f. \; F& J- _
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');期望的结果
, k# q4 y: W: N, l0 F' l2013-03-01: 02013-03-02: 02013-03-03: 2002013-03-04: 02013-03-5:100               
4 o( F0 ?5 B' c# J2 D    解决方案:                                                                2 v1 W" d- v( `. f# x6 {$ H
                                                                SELECT  a.date,COUNT(b.campaignid) totalStat  d! U3 F) L9 A! \
                FROM    campaigndata a+ ], X( ]1 m; N9 C3 \) K. v  `) m, |$ `
                                                LEFT JOIN campaignfilter b; M+ C9 q' ]. t
                                                                ON  a.campaignid = b.campaignid AND  k9 t" e4 t' ]/ |. U
                                                                                b.campaigntype = 1
) \9 T) W) U, I# M7 y. D                GROUP   BY a.date4 h1 `+ {2 Q1 K' G6 C
为进一步获取相关知识,请访问以下链接:
5 p# Q* Q/ [/ RSQL可视表示连接更新1
. s! C# ]: x# v" mSELECT  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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则