php - Mysql汇总所有包含两列之一中的值的行

标签 php mysql sql subquery union

我有一个表,可能在两列(B 列和/或 C 列)之一中具有搜索值。我想根据 A 列生成一个摘要,显示所选搜索值的次数(例如 x ) 出现在每个人的任一列中。我想计算两列中的总数。

+--------+------+----+
|  name  | B    | C  |
+--------+------+----+ 
| john   | x    | z  |
| john   | x    | x  |
| john   | y    | x  |
| peter  | x    | z  |
| peter  | x    | z  |
| amanda | x    | x  |
| amanda | x    | x  |
| amanda | x    | x  |
| amanda | x    | y  |
| amanda | x    | y  |
+--------+-----------+

在上面的示例中,假设我的搜索值为 x,我想计算每个人在 B 列和/或 C 列中出现 x 的次数。我还想生成总计,并生成以下输出:

Name   B  C

john   2  2
peter  2  0
amanda 5  3
total  9  5

我可以像这样分别为每一列做:

     SELECT name, COUNT(*) as count FROM table 
          WHERE A = 'x'
          GROUP BY name
          ORDER BY count DESC";

     SELECT name, COUNT(*) as count FROM table 
          WHERE B = 'x'
          GROUP BY name
          ORDER BY count DESC";

然后我可以循环对每个输出进行单独提取并将它们组合起来,但我想知道是否有一种方法可以在一个 mysql 语句中对两列进行检查和计数?

最佳答案

如果您想要分别计算每列的总和,则可以使用以下 ( SQL Fiddle):

(
  SELECT MTA.Name, Sum(MTA.B = 'x') AS BSum, Sum(MTA.C = 'x') AS CSum
  FROM MyTable MTA
  GROUP BY MTA.Name
)
UNION
(
  SELECT 'Total' AS name, Sum(MTB.B = 'x') AS BSum, Sum(MTB.C = 'x') AS CSum
  FROM MyTable AS MTB
)

或者,如果您希望合并两列的总和,则可以执行类似以下操作 ( SQL Fiddle ):

(
  SELECT MTA.Name, Sum(MTA.B = 'x') + Sum(MTA.C = 'x') AS PersonTotal
  FROM MyTable MTA
  GROUP BY MTA.Name
)
UNION
(
  SELECT 'Total' AS name, Sum(MTB.B = 'x') + Sum(MTB.C = 'x') AS PersonTotal
  FROM MyTable AS MTB
)

关于php - Mysql汇总所有包含两列之一中的值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19531677/

相关文章:

php - 关于 MySQL 表设置的一般效率问题

PHP 安全问题?

mysql - 使用group by子句时Sql查询错误

c# - 连接字符串中下划线后的数据库名称被忽略

javascript - 如何在提交 Google Recaptcha 后自动重定向?

php - 如何在PHP中捕获错误代码

php - 如何配置PhpStorm远程Xdebug路径映射

mysql - sql无法显示列的起始值中唯一的字符串值

sql - Django 是否对基本查询(使用 Postgres)进行索引优化?

php - SQL 查询始终选择不匹配的行