|
我有一张表,每个日期都有一些统计信息,我想用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 |
|