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

从表上的不同条件中选择COUNT个

王翰墨
2023-03-14
问题内容

我有一个名为“工作”的表。对于特定html" target="_blank">用户,作业可以是活动的,已归档的,过期的,待处理的或已关闭的。现在,每个页面请求都生成5个COUNT查询,为了进行优化,我试图将其减少为单个查询。到目前为止,这是我所拥有的,但这仅比5个单独的查询要快。请注意,我已经简化了每个子查询的条件,以使其更易于理解,但是完整查询的行为相同。

有没有一种方法可以在不使用无效子查询的情况下在同一查询中获得这5个计数?

SELECT
  (SELECT count(*)
    FROM "jobs"
    WHERE
      jobs.creator_id = 5 AND
      jobs.status_id NOT IN (8,3,11) /* 8,3,11 being 'inactive' related statuses */
  ) AS active_count, 
  (SELECT count(*)
    FROM "jobs"
    WHERE
      jobs.creator_id = 5 AND
      jobs.due_date < '2011-06-14' AND
      jobs.status_id NOT IN(8,11,5,3) /* Grabs the overdue active jobs
                                      ('5' means completed successfully) */
  ) AS overdue_count,
  (SELECT count(*)
    FROM "jobs"
    WHERE
      jobs.creator_id = 5 AND
      jobs.due_date BETWEEN '2011-06-14' AND '2011-06-15 06:00:00.000000'
  ) AS due_today_count

继续进行另外2个子查询,但我认为您明白了。

是否有一种更简单的方法来收集此数据,因为它与Jobs表中的同一数据子集基本相差5个不同的COUNT?

数据子集为“ creator_id =
5”,此后每个计数基本上只是1-2个附加条件。请注意,现在我们正在使用Postgres,但可能会在不久的将来转向MySQL。因此,如果您可以提供与ANSI兼容的解决方案,我将不胜感激:)


问题答案:

这是典型的解决方案。使用case语句来分解不同的条件。如果一条记录满足,则得到1,否则得到0。然后SUM对值执行a

  SELECT
    SUM(active_count) active_count,
    SUM(overdue_count) overdue_count
    SUM(due_today_count) due_today_count
  FROM 
  (

  SELECT 
    CASE WHEN jobs.status_id NOT IN (8,3,11) THEN 1 ELSE 0 END active_count,
    CASE WHEN jobs.due_date < '2011-06-14' AND jobs.status_id NOT IN(8,11,5,3)  THEN 1 ELSE 0 END  overdue_count,
    CASE WHEN jobs.due_date BETWEEN '2011-06-14' AND '2011-06-15 06:00:00.000000' THEN 1 ELSE 0 END  due_today_count

    FROM "jobs"
    WHERE
      jobs.creator_id = 5 ) t

UPDATE如前所述,当0记录作为t返回时,此结果将作为所有值中Null的单个结果。您有三个选择

1)添加一个Haveing子句,以便您没有返回记录,而不是所有NULLS的结果

   HAVING SUM(active_count) is not null

2)如果您希望返回所有零,则可以对所有总和加总

例如

 SELECT
      COALESCE(SUM(active_count)) active_count,
       COALESCE(SUM(overdue_count)) overdue_count
      COALESCE(SUM(due_today_count)) due_today_count

3)利用COUNT(NULL) = 0sbarro所展示的事实。您应该注意,非空值可以是任何数字,而不必为1

例如

 SELECT
      COUNT(CASE WHEN 
            jobs.status_id NOT IN (8,3,11) THEN 'Manticores Rock' ELSE NULL
       END) as [active_count]


 类似资料:
  • 问题内容: 我能够同时获取mysql查询结果的值和行。 但是我在努力获得查询的单个输出。例如: 我需要显示结果。但是我没有得到结果。 我尝试了以下方法: 但是我没有成功显示(获取)实际值。 问题答案: 您需要使用关键字为聚合设置别名,以便从中进行调用

  • 问题内容: 我可以从一个表中的列中执行以下SQL Server选择不同(或非重复名称)的操作,如下所示: 但是,如果我有多个表(所有这些表都包含名为[Name]的名称字段),并且我需要知道两个或多个表中非重复名称的计数,该怎么办? 如果我运行这样的事情: 我收到一个错误,“歧义列名’Name’”。 PS。这三个表[MyTable1],[MyTable2],[MyTable3]都是先前选择的产品。

  • 我能够同时获得mysql查询结果的值和行。 但我很难获得查询的单个输出。例如: 我需要显示结果。但我没有得到结果。 我尝试了以下几种方法: 但我没有成功地显示(获取)实际值。

  • 问题内容: 当您限制通常用于分页的SQL查询返回的行数时,有两种方法可确定记录总数: 方法1 将选项包括在原始选项中,然后通过运行获取总行数: 方法二 正常运行查询,然后通过运行获取总行数 哪种方法最好/最快? 问题答案: 这取决于。请参阅有关此主题的MySQL Performance Blog帖子:http : //www.mysqlperformanceblog.com/2007/08/28/

  • 问题内容: 这是我无法弄清楚的非常基本的查询。 假设我有一个两列的表格,如下所示: 我想获取所有具有1、2和3的不同用户ID 。使用上面的示例,我要返回的唯一结果是1。我该怎么做? 问题答案: 任何人阅读本:我的答案是简单明了的,并得到了“接受”的地位,但请不要去阅读答案通过@cletus给出。它具有更好的性能。 只是大声思考一下,@ cletus所描述的编写自联接的另一种方法是: 这对您来说可能

  • 尝试运行一些SQL而没有运气,尝试从两个条件为true的表中选择数据。 这些表是驱动程序的详细信息和位置。这两个表都有列user_id,我想根据between部分中匹配的user_id从这两个表中获取数据。(select语句工作并返回ID); 我得到的错误:致命错误:调用一个成员函数bind_param()在一个非对象在C:\xampp\htdocs\矢量\www\脚本\getDriversInR