2010-07-21 89 views
1

我试图找到所有列出的字段的总和,但考虑到它们是子查询...我需要使用别名。如果我使用列出的别名,我会得到列/字段未知错误......并且如果我尝试使用group by的总和(points),那么我将无效使用group clause错误。SQL - 别名字段的总和

SELECT DISTINCT pr.competitorID AS compID, pr.age, CONCAT(pr.firstname, ' ', pr.lastname)AS name 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=1 AND participation_reports.competitorID=compID LIMIT 1) AS '100m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=25 AND participation_reports.competitorID=compID LIMIT 1) AS '200m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=37 AND participation_reports.competitorID=compID LIMIT 1) AS '400m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=49 AND participation_reports.competitorID=compID LIMIT 1) AS '800m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=61 AND participation_reports.competitorID=compID LIMIT 1) AS '1500m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=67 AND participation_reports.competitorID=compID LIMIT 1) AS '3000m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=69 AND participation_reports.competitorID=compID LIMIT 1) AS 'Javelin' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=81 AND participation_reports.competitorID=compID LIMIT 1) AS 'Shot Put' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=93 AND participation_reports.competitorID=compID LIMIT 1) AS 'Discus' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=105 AND participation_reports.competitorID=compID LIMIT 1) AS 'High Jump' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=117 AND participation_reports.competitorID=compID LIMIT 1) AS 'Long Jump' 
, (SELECT SUM(participation_reports.points) FROM participation_reports WHERE participation_reports.competitorID=compID) AS total 
FROM participation_reports AS pr 
JOIN event_data on event_data.eventID=pr.heatEventID 
WHERE event_data.minAge <= pr.age AND event_data.maxAge >= pr.age AND sex = 'F' 
AND total > 0 
LIMIT 30 

感谢您的任何想法。

+0

这似乎是http://stackoverflow.com/questions/3289941/unknown-column-in-where-its-defined-right-there的重复。 – 2010-07-21 13:07:28

回答

1

将该查询包装为派生表,然后选择总和。

+0

所以我需要使用临时表?任何替代品? – 2010-07-21 03:23:14

+0

@ pc-nerd - 有关您的架构的更多信息将使您更容易地优化答案。你有没有可以在连接中交叉引用的表来消除所有子查询的需要?你如何依赖那些列作为列?你能通过输出分组吗?另一种选择是将它放在视图中,然后从中查询。 – 2010-07-21 03:28:37

+0

好的......如果你愿意的话,我大概可以粘贴相关信息。 columsn是子查询的原因是每一列都是一项运动,但是该运动的事件将根据查询的年龄段/性别(这在所有年龄段/性别的php循环中运行)发生变化......因此,事件是特定于该运动/性别/年龄。这些列肯定是必需的......交叉引用如何消除它们? – 2010-07-21 03:46:04

3

这给一个镜头:

SELECT 
    pr.competitorID AS compID 
    , pr.age 
    , CONCAT(pr.firstname, ' ', pr.lastname) AS name 
    , SUM(CASE 
     WHEN pr.heatEventID=1 
     THEN pr.points 
     ELSE 0 END) AS "100m" 
    , SUM(CASE 
     WHEN pr.heatEventID=25 
     THEN pr.points 
     ELSE 0 END) AS "200m" 
    ... 
    , SUM(CASE 
     WHEN pr.heatEventID IN (1,25,...) 
     THEN pr.points 
     ELSE 0 END) AS total 
FROM 
    participation_reports pr 
    JOIN event_data 
    ON event_data.eventID = pr.heatEventID 
WHERE 
    ... 
GROUP BY 
    pr.competitorID 
    , pr.age 
    , CONCAT(pr.firstname, ' ', pr.lastname) 
+0

+1这也是一个非常好的方法。 – 2010-07-21 03:37:22

+0

该解决方案似乎并没有工作,其基于事实我不能在WHERE子句中使用列别名(我认为它解析它,这样的别名是最后的东西要在所有列搜索,条件匹配和排序后应用等等...) 我想(我可能是错的),你不能使用列别名除了在SELECT子句中定义它们。 编辑:具体 - 我需要最高SUM(点)行...,我不想要任何行SUM(点)是0(表示没有参与)。 – 2010-07-21 03:42:30

+0

您不需要在WHERE子句中使用列别名。 – bernie 2010-07-21 03:49:31

0

我不是你需要什么很清楚,但如果你想所有这些锯齿列的总和,可能你的麻烦不是,他们是不合法的列名字呢?如何...

SELECT DISTINCT pr.competitorID AS compID, pr.age, CONCAT(pr.firstname, ' ', pr.lastname)AS name 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=1 AND participation_reports.competitorID=compID LIMIT 1) AS c_100m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=25 AND participation_reports.competitorID=compID LIMIT 1) AS c_200m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=37 AND participation_reports.competitorID=compID LIMIT 1) AS c_400m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=49 AND participation_reports.competitorID=compID LIMIT 1) AS c_800m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=61 AND participation_reports.competitorID=compID LIMIT 1) AS c_1500m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=67 AND participation_reports.competitorID=compID LIMIT 1) AS c_3000m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=69 AND participation_reports.competitorID=compID LIMIT 1) AS Javelin 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=81 AND participation_reports.competitorID=compID LIMIT 1) AS Shot_Put 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=93 AND participation_reports.competitorID=compID LIMIT 1) AS Discus 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=105 AND participation_reports.competitorID=compID LIMIT 1) AS High_Jump 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=117 AND participation_reports.competitorID=compID LIMIT 1) AS Long_Jump, 
c_100m + c_200m + c_400m + c_800m + c_1500m + c_3000m + Javelin + Shot_Put + High_Jump + Long_Jump 
, (SELECT SUM(participation_reports.points) FROM participation_reports WHERE participation_reports.competitorID=compID) AS total 
FROM participation_reports AS pr 
JOIN event_data on event_data.eventID=pr.heatEventID 
WHERE event_data.minAge <= pr.age AND event_data.maxAge >= pr.age AND sex = 'F' 
AND total > 0 
LIMIT 30 

还是我误会了这个问题?

+0

嗨, 我试过你的解决方案,但我仍然得到一个未定义的c_100m列。从我的阅读中我相当肯定,在这种情况下我不能使用字段别名。 ***我认为我目前几乎可以正常工作的解决方案是循环使用php并查询每个字段,并根据另一个单独的查询获得总和,这个数字是ineffient的两倍 - 但没有更多的时间用于纠正这个问题,决赛桌是紧急的...... thnx虽然 – 2010-07-21 12:33:10

+0

右键。对不起,我无法提供更多帮助。 – 2010-07-21 12:44:28