mysql - SQL 组合多个 SELECT 语句

标签 mysql sql sqlite datetime aggregate-functions

我正在尝试构建一个将从单个表收集统计信息的 SQLite 查询。

该表包含各种类型的日志,每天有多个条目。我需要在搜索参数中为每一天获取一个单独的行,然后使用某些 bool 值编译这些日期内的行总数。

这是我目前的查询:

SELECT DATE(DateTime) AS SearchDate,
     (SELECT COUNT() AS Total
                FROM CallRecords
                WHERE DATE(DateTime)
                BETWEEN '2017-08-27' AND '2017-09-02'
                GROUP BY DATE(DateTime)
                ORDER BY Total DESC) AS Total,
    (SELECT COUNT() AS Total
                FROM CallRecords
                WHERE NoMarket = 1
                AND DATE(DateTime)
                BETWEEN '2017-08-27' AND '2017-09-02'
                GROUP BY DATE(DateTime)
                ORDER BY Total DESC) AS NoMarkets,
    (SELECT COUNT() AS Total
                FROM CallRecords
                WHERE Complaint = 1
                AND DATE(DateTime)
                BETWEEN '2017-08-27' AND '2017-09-02'
                GROUP BY DATE(DateTime)
                ORDER BY Total DESC) AS Complaints,
    (SELECT COUNT() AS Total
                FROM CallRecords
                WHERE Voicemail = 1
                AND DATE(DateTime)
                BETWEEN '2017-08-27' AND '2017-09-02'
                GROUP BY DATE(DateTime)
                ORDER BY Total DESC) AS Voicemails
FROM CallRecords
WHERE DATE(DateTime) BETWEEN '2017-08-27' AND '2017-09-02'
GROUP BY SearchDate

输出:

8/28/2017   175 27      11
8/29/2017   175 27      11
8/30/2017   175 27      11
8/31/2017   175 27      11
9/1/2017    175 27      11

如您所见,它正确地获取了每个单独的日期,但列的总计不正确。

显然,我在查询中遗漏了一些东西,但我不确定在哪里。有没有更好的方法来执行此查询?

编辑:我在这里调查了其他几个标题几乎相同的问题,但我没有找到与我正在寻找的内容相似的内容。大多数看起来比我想要完成的要复杂得多。

最佳答案

您的 CallRecords 中的列似乎乱七八糟名称类似 Complaint 的表和 Voicemail ,其中每一个都对调用进行分类。

看起来这些列在相关时具有值 1。

所以这个查询应该可以帮到你。

SELECT DATE(DateTime) AS SearchDate,
       COUNT(*) AS Total,
       SUM(NoMarket = 1) AS NoMarkets,
       SUM(Complaint = 1) AS Complaints,
       SUM(Voicemail = 1) AS Voicemails
  FROM CallRecords
 WHERE DateTime >=  '2017-08-27'
   AND DateTime <   '2017-09-02' + INTERVAL 1 DAY
 GROUP BY DATE(DateTime)

为什么会这样?因为在 MySQL 中有一个像 Voicemail = 1 这样的 bool 表达式具有值 1什么时候是真的0当它是假的。您可以很好地总结这些值。

为什么它比你拥有的更快?因为DATE(DateTime) BETWEEN this AND that无法利用 DateTime 上的索引.

为什么日期范围的末尾是正确的?因为DateTime < '2017-09-02' + INTERVAL 1 DAY提取所有记录,直到但不包括在您的日期范围之后的午夜。

如果您使用的是 Sqlite,则需要 AND DateTime < date('2017-09-02', '+1 day') . + INTERVAL 1 DAY那里的东西略有不同。

关于mysql - SQL 组合多个 SELECT 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46102524/

相关文章:

mysql - 从用户未登录且不属于其他表行的一部分的表中选择用户

php - 我试图在 php 中创建一个循环,它会吐出下面的内容

sql - 将多行中的值求和到一行中

c# - UWP SQLite 查询结果类包含另一个类

java - Android - sqlite in 子句使用数组列表中的字符串值?

mysql - 如何从 VB.NET 和 MySql 8 中的给定记录读取特定列?

php - 错误 "Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0"

sql - 当 SELECT WITH (NOLOCK) 提示时,是否阻止了半写值读取?

sqlite3 一起选择最小值,最大值比单独选择它们要慢得多

android - 如何使用 Loader 更新单个 TextView