mysql - 将单个事件距离表转换为事件汇总表

标签 mysql

两周前,我开始学习 SQL,到目前为止进展顺利,但我遇到了一个我似乎无法解决的情况。经过两天的网上搜索和阅读书籍,我离解决这个问题还差得很远,所以是时候寻求帮助了。我的部分问题是,作为 SQL 的新手,我不确定要搜索什么。

这是使用 mySQL 和 INNODB。

经过一些加入和其他事情后,我得到了下表,其中包含运动员信息,其中给出了运动员参加的赛事类型和该赛事的距离。可能的事件/距离组合是 {A10,A15,B10,B15}。

事件表

last_name   first_name  event   distance
Munster     Eddie       A       10
Brady       Marsha      A       10
Clampet     Jethro      B       15
Grumby      Jonas       A       15
Brady       Peter       A       10
Brady       Marsha      A       10
Brady       Marsha      B       15
Grant       Ginger      B       15
Munster     Eddie       B       10
Brady       Marsha      A       10

作为最后一步,我要做的是将此表转换为显示每个运动员参加每个项目的次数的形式,如以下输出:

last_name   first_name  A10     A15     B10     B15
Munster     Eddie       1       0       1       0
Brady       Marsha      3       0       0       1
Clampet     Jethro      0       0       0       1
Grumby      Jonas       0       1       0       0
Brady       Peter       1       0       0       0
Grant       Ginger      0       0       0       1

我想我想使用相关子查询,所以我尝试了以下 SQL 查询的多种变体,但它返回“操作数应包含 1 列”,这是有道理的。

SELECT last_name, first_name,
count(if(event='A',1,0) AND if(distance=10,1,0)) AS A10
FROM sample s
WHERE (SELECT last_name, first_name, event, distance
  FROM sample s1
  WHERE s1.last_name = s.last_name
  )
ORDER BY last_name, first_name;

我看到我需要的步骤是: 1.在表中创建一组我可以做的每个名字,然后 2.遍历每个名​​字,创建一个新的查询选择事件/距离然后 3. 对事件/距离组合的查询求和; 4. 将结果返回给#1。

我看到程序提供了一些循环功能,这是执行此操作的方法吗?我想做的事情在 SQL 环境中是否可行?我的下一步是将原始表转储到 PHP 并在那里进行处理。

非常感谢任何想法和/或解决方案。

最佳答案

添加GROUP BY:

SELECT last_name, 
       first_name, 
       count(if(event = 'A', 1, NULL) 
             AND if(distance = 10, 1, NULL)) AS A10, 
       count(if(event = 'A', 1, NULL) 
             AND if(distance = 15, 1, NULL)) AS A15, 
       count(if(event = 'B', 1, NULL) 
             AND if(distance = 10, 1, NULL)) AS B10, 
       count(if(event = 'B', 1, NULL) 
             AND if(distance = 15, 1, NULL)) AS B15 
FROM   sample s 
GROUP  BY last_name, 
          first_name 
ORDER  BY last_name, 
          first_name; 

关于mysql - 将单个事件距离表转换为事件汇总表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18686917/

相关文章:

mysql - 通过 Eloquent 在 laravel 中找到具有相同值的两列?

mysql - 生日 table 上最年长的人。 SQL子查询

mysql - Spring batch itemwriter删除mysql中的记录

mysql - Icinga 2 中的模式版本问题

mysql innodb 更改两个具有外键的表

mysql - sql 代码在使用 mac 的 phpmyadmin 中不起作用?

c# - 如何从 C# 复制数据库?

mysql - 多个查询还是 LEFT JOIN 更快?

MySQL 查询选择具有最新 created_at 日期的行到列中

php - 处理存储有不同数据的多个用户组的最佳方式?