我有一个包含3列的奖品表:
| event_id | place | money |
我正在尝试使用event_id和第一,第二,第三奖来显示结果。
到目前为止,我已经尝试过这个:
SELECT event_id, (SELECT money AS first FROM prize WHERE place = 1)
FROM prize
但是我得到子查询返回超过1行的错误。
答案 0 :(得分:1)
如果您确定每个活动只有一个条目&地点组合,您还可以使用SUM
和IF
函数的组合:
SELECT event_id
,SUM(IF(place=1, money, 0)) As 'FirstPlace'
,SUM(IF(place=2, money, 0)) As 'SecondPlace'
,SUM(IF(place=3, money, 0)) As 'ThirdPlace'
FROM prize
GROUP BY event_id;
IF
function用于确保返回正确位置的正确金额。 (它检查第一个表达式的真实性,如果第一个表达式为真则返回第二个表达式,如果第一个表达式为假,则返回第三个表达式。)
请参阅此SQL Fiddle(改编自McAdam331's answer)。
答案 1 :(得分:0)
您的问题有点模糊,因此假设您的表格包含以下列:
event_id, place, money
您可以执行以下查询:
SELECT event_id
,case
when place = 1 then "first"
when place = 2 then "second"
when place = 3 then "third"
end as place
,money
from Prize
GROUP by event_Id, place
否则,您能否提供更多详细信息,例如表格结构和示例记录?
请注意我没有测试过SQL
编辑 - 您收到错误的原因是因为您的子查询不受事件限制,只限于某个地方。因此返回所有第一名结果,而不是按事件分组
答案 2 :(得分:0)
如果你要打破这一点,你可以获得这样的每个事件的第一名:
SELECT *
FROM prize
WHERE place = 1;
您可以为第二个位置执行相同操作,并使用连接到原始表以获取第二个位置值,如下所示:
SELECT t1.event_id, t1.money AS first
FROM(
SELECT event_id, money
FROM prize
WHERE place = 1) t1
JOIN(
SELECT event_id, money
FROM prize
WHERE place = 2) t2 ON t2.event_id = t1.event_id
JOIN(
SELECT event_id, money
FROM prize
WHERE place = 3) t3 ON t3.event_id = t1.event_id;
这是一个SQL Fiddle示例。请注意,如果事件至少没有第一个,第二个和第三个,则会中断。如果可以有更少的行,我会使用外连接。如果事件有多个第一行,这也可能会返回意外结果。