为每个事件显示多个类别

时间:2015-08-03 16:02:01

标签: mysql subquery

我有一个包含3列的奖品表:

| event_id | place | money |

我正在尝试使用event_id和第一,第二,第三奖来显示结果。

到目前为止,我已经尝试过这个:

SELECT event_id, (SELECT money AS first FROM prize WHERE place = 1)
FROM prize

但是我得到子查询返回超过1行的错误。

3 个答案:

答案 0 :(得分:1)

如果您确定每个活动只有一个条目&地点组合,您还可以使用SUMIF函数的组合:

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示例。请注意,如果事件至少没有第一个,第二个和第三个,则会中断。如果可以有更少的行,我会使用外连接。如果事件有多个第一行,这也可能会返回意外结果。