当前位置: 首页 > 面试题库 >

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

穆景辉
2023-03-14
问题内容

我有一张表,每个日期都有一些统计信息,我想用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-in​​t(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, '2013-03-03', 2, 100),
(3, '2013-03-03', 3, 100),
(4, '2013-03-04', 2, 100),
(5, '2013-03-05', 1, 100),
(6, '2013-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: 0
2013-03-02: 0
2013-03-03: 200
2013-03-04: 0
2013-03-05: 100

问题答案:

SELECT a.date, COUNT(b.campaignid) totalStat
FROM campaigndata a
LEFT JOIN campaignfilter b
ON a.campaignid = b.campaignid AND
b.campaigntype = 1
GROUP BY a.date

要进一步获得有关联接的知识,请访问以下链接:

  • SQL连接的可视表示

更新1

SELECT  a.date, 
        COALESCE(b.totals,0) totals
FROM    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 = 1
            GROUP   BY a.date
        ) b ON a.date = b.date


 类似资料:
  • 目前,我正在为客户列表开发一个“过滤器”功能。 我有以下子查询,我不确定是否有办法用CriteriaBuilder构建它。它也可以在没有multiselect但是我需要、和来选择最小值。结果应该是一个数字。 例如客户余额表 更新:这是我当前的代码,但是 如何为我的子查询添加排序依据 如何设置maxResult 谢谢!B

  • 本文向大家介绍laravel 模型查询按照whereIn排序的示例,包括了laravel 模型查询按照whereIn排序的示例的使用技巧和注意事项,需要的朋友参考一下 实例如下所示: 中午没睡觉一直调试,心塞... 错误写法 原因解析 以上这篇laravel 模型查询按照whereIn排序的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我需要将以下查询转换为hibernate条件查询。请帮忙 由于投票表上的复合主键,我用@Embeddable分隔了主键,所以后面的createQuery不起作用 和可嵌入对象 请建议一个更好的方法。

  • 问题内容: 我很好奇为何应该比更快地执行。 当比尔·卡尔文提出一个要点时,我正在回答一个问题。当您使用它时,它使用相关子查询(依赖子查询),而IN()仅使用子查询。 解释显示,并且两者都使用了一个依赖子查询,并且都只使用了一个子查询..所以我很好奇关联子查询如何比子查询更快? 我以前使用过EXISTS,它的执行速度比IN快,这就是我感到困惑的原因。 这是带有说明的SQLFIDDLE 一些问题 在上

  • 问题内容: 我正在尝试用另一列分组的该列的最大值更新表中的一列。 例如,假设我们有一个名为transactions的表,其中有两列:和。无论出于何种原因,我们都希望将其设置为等于每个值的最大值。 我很沮丧并且不擅长在SQL中执行这样的操作,但是到目前为止,这是我所拥有的: 问题答案: 除了@Gordon已经指出的语法错误之外,通常最好 排除空更新 : 无需更改任何内容就无需编写新的行版本(几乎需要

  • 而且 现在的问题是: > 我必须如何在ALL_ORDERS子查询的底部执行联接?我已经尝试了以下操作: null 感谢任何帮助。

  • 问题内容: 我是一个老派的MySQL用户,并且始终喜欢子查询。但是如今,每个人都使用子查询,而我讨厌它。我不知道为什么 我缺乏理论知识来自行判断是否存在差异。子查询是否与a一样好,因此不必担心吗? 问题答案: 取自MySQL手册 (13.2.10.11将子查询重写为Joins): LEFT [OUTER] JOIN可以比同等子查询更快,因为服务器可能可以更好地对其进行优化-这不仅限于MySQL S

  • 问题内容: 我重构了从另一家公司继承来的应用程序的慢速部分,以使用内部联接而不是子查询,例如: 重构查询的运行速度大约快100倍。 (约50秒,约0.3秒)我期望有所改善,但是谁能解释为什么如此剧烈?where子句中使用的列均已建立索引。SQL是否在where子句中每行执行一次查询? 更新 -说明结果: 区别在于查询“(id)in()”的第二部分- vs 1带有连接的索引行: 问题答案: “相关子