为每个事件显示多个类别

Show multiple categories for each event

我有一个奖品 table 有 3 列:

| event_id | place | money |

我正在努力让结果显示 event_id,以及一等奖、二等奖、三等奖。

到目前为止我试过这个:

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

但是我得到的错误是子查询 returns 多于 1 行。

你的问题有点含糊,所以假设你的 table 有以下列: 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

否则,您能否提供更多详细信息,例如 table 结构和示例记录?

请注意我没有测试 SQL

编辑 - 你得到那个错误的原因是因为你的子查询不受事件限制,只有一个地方。所以所有第一名的结果都会被返回,而不是按事件分组

如果你要打破这个,你可以获得每个事件的第一名:

SELECT *
FROM prize
WHERE place = 1;

你可以对第二名做同样的事情,并使用与原始 table 的连接来获得第二名的值,如下所示:

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

如果您非常确定每个事件和地点组合只有一个条目,您还可以使用 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 用于确保返回正确地点的正确金额。 (它检查第一个表达式的真实性,returns 如果第一个表达式为真,则检查第二个表达式,如果第一个表达式为假,则检查第三个表达式。)

看到这个SQL Fiddle (adapted from )。