gpt4 book ai didi

mysql - 计算多行

转载 作者:行者123 更新时间:2023-11-29 01:42:14 24 4
gpt4 key购买 nike

我想知道是否可以像这样计算同一张表中的行数:

我有一个名为 tickets 的表,其中包含标题、内容等...

有一个名为 status 的列,其中状态可以是:

new 
waiting
assign
closed
solved

我希望能够计数

new tickets 
waiting tickets
assign tickets
closed tickets
solved tickets

以及同一请求中的所有票证,是否可能或者我应该为每张票证都提出新的请求?谢谢!

最佳答案

在一个请求中完成,因为这(几乎总是)比运行多个查询更有效。

将结果作为单行获取的一种方法是这样的:

SELECT SUM(status='new'     ) AS count_new
, SUM(status='waiting' ) AS count_waiting
, SUM(status='assign' ) AS count_assign
FROM tickets

如果您还需要所有门票的计数,您可以将其添加到 SELECT 列表中:

     , SUM(1)                 AS count_all

如果你还想把新的和等待的都加起来,你也可以这样加:

     , SUM(status IN ('new','waiting')) AS count_new_or_waiting

注意

 SUM(a=b) 

基本上是以下内容的简写:

 SUM(IF(a=b,1,0))

略有不同,当 a 或 b 为 null 时,前者将返回 NULL,因此有可能返回 NULL,并且理论上 SUM 可能为 NULL。将任何 NULL 转换为 0 的一种简单方法是使用 IFNULL 函数:

IFNULL(SUM(a=b))

另一种避免 NULL 的方法是使用 MySQL 的“null safe equality”比较器,

SUM(a<=>b)

如果你想要一些可移植的东西,那么最好的选择是符合 SQL-92 的东西:

SUM(CASE WHEN a=b THEN 1 ELSE 0 END)

一般方法是一样的。我们正在查看满足谓词的每一行(例如,我们可能有一个日期范围或行,或一个特定的商店,或类似的东西。)我们正在检查每一行以查看它是否应该计入特定的存储桶.一行可以计入多个桶(如上所示)。

这种方法 (IMO) 的优点之一是查询将为没有任何行的状态返回零计数。其他方法省略了行,我认为这会使处理行的代码更难理解。处理此查询的结果集可生成更直接的代码。


上面的示例使用了 MySQL 特定的语法。 (更便携的)ANSI 等价物并不那么简洁。有些人可能会争辩说 ANSI 语法更容易理解,特别是对于那些更熟悉 DBMS 而不是 MySQL 的人来说。

 SELECT SUM(CASE WHEN status = 'new'     THEN 1 ELSE 0 END) AS count_new
, SUM(CASE WHEN status = 'waiting' THEN 1 ELSE 0 END) AS count_waiting
FROM tickets

此模式可以通过一些分组(针对部门、客户、客户类型)扩展到这些计数。我们可以添加一个谓词(WHERE 子句)来获取行的子集,或者我们可以添加一个表达式expr 在 SELECT 列表中,并添加一个 GROUP BY expr

例如,为每个不同的值“优先级”获取票数,例如关键、紧急、重要、低级

 SELECT t.priority
, SUM(CASE WHEN t.status = 'new' THEN 1 ELSE 0 END) AS count_new
, SUM(CASE WHEN t.status = 'waiting' THEN 1 ELSE 0 END) AS count_waiting
FROM tickets t
GROUP BY t.priority
ORDER BY IF(t.status='urgent',1,2), t.status

(order by 子句中的第一个表达式将首先对“紧急”进行排序。)

通过这种方法,“循环处理”不再针对不同的计数,而是针对分组列。如果网页要显示如下内容,此结果集可提供方便的代码:

 Priority     New    Waiting   Assign  Total
URGENT 1 0 0 1
CRITICAL 0 0 1 1
IMPORTANT 12 7 3 22
LOW 77 1048 2 1127

关于mysql - 计算多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17740201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com