为每个事件显示多个类别
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 出乎意料的结果。
如果您非常确定每个事件和地点组合只有一个条目,您还可以使用 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 用于确保返回正确地点的正确金额。 (它检查第一个表达式的真实性,returns 如果第一个表达式为真,则检查第二个表达式,如果第一个表达式为假,则检查第三个表达式。)
看到这个SQL Fiddle (adapted from )。
我有一个奖品 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 出乎意料的结果。
如果您非常确定每个事件和地点组合只有一个条目,您还可以使用 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 用于确保返回正确地点的正确金额。 (它检查第一个表达式的真实性,returns 如果第一个表达式为真,则检查第二个表达式,如果第一个表达式为假,则检查第三个表达式。)
看到这个SQL Fiddle (adapted from