两个星期前,我开始学习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并在那里进行处理。
非常感谢任何想法和/或解决方案。
答案 0 :(得分:1)
添加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;
答案 1 :(得分:0)
我建议使用SUM + CASE
语法
尝试这样的事情:
SELECT LAST_NAME,
FIRST_NAME,
SUM(CASE
WHEN EVENT = 'A'
AND DISTANCE = 10 THEN 1
ELSE 0
END) AS A10,
SUM(CASE
WHEN EVENT = 'A'
AND DISTANCE = 15 THEN 1
ELSE 0
END) AS A15,
SUM(CASE
WHEN EVENT = 'B'
AND DISTANCE = 10 THEN 1
ELSE 0
END) AS B10,
SUM(CASE
WHEN EVENT = 'B'
AND DISTANCE = 15 THEN 1
ELSE 0
END) AS B15
FROM SAMPLE
GROUP BY LAST_NAME,
FIRST_NAME
您可以在SQL Fiddle找到一个有效的例子。
祝你好运!