2011-11-28 70 views
2

我试图运行SQL查询以在竞争中显示一组打斗的结果。 战斗细节存储在战斗机1,战斗机2和获胜者的字段中。 我需要做的就是把在一起的所有战斗的列表,每个战斗在列表中出现两次 - 一次用,例如如果两个'OR'条件都为真,则返回相同的行

Competitor:fighter1, Opponent:fighter2, Winner:fighter1 

而且,其他地方的列表

Competitor:fighter2, Opponent:fighter1, Winner:fighter1 

我一直在使用一个sql union从每次打斗拉两次细节,并试图给战斗机1和战斗机2列分配不同的别名来交换它们,但我甚至不确定这是否可能。

我的查询是这样的(与其他表省略不必要的东西)

SELECT wp_ema_fights.fighter1 AS competitor, 
wp_ema_fights.fighter2 AS opponent, 
wp_ema_fights.winner AS winner 
FROM wp_ema_fights 
UNION ALL 
SELECT wp_ema_fights.fighter1 AS opponent, 
wp_ema_fights.fighter2 AS competitor, 
wp_ema_fights.winner AS winner 
FROM wp_ema_fights 
ORDER BY competitor 

此查询显示各打了两次,但像这样:

Competitor:fighter1, Opponent:fighter2, Winner:fighter1 
Competitor:fighter1, Opponent:fighter2, Winner:fighter1 

有没有人有任何想法如何我可以将两者交换,并根据每次战斗机被指定为“竞争对手”的顺序排列列表。

在此先感谢。

回答

2

尝试:

SELECT wp_ema_fights.fighter1 AS competitor, 
     wp_ema_fights.fighter2 AS opponent, 
     wp_ema_fights.winner AS winner 
FROM  wp_ema_fights 
UNION ALL 
SELECT wp_ema_fights.fighter2 AS competitor, 
     wp_ema_fights.fighter1 AS opponent, 
     wp_ema_fights.winner AS winner 
FROM  wp_ema_fights 
ORDER BY competitor 
+0

+1:不要移动SELECT语句中的字段,在***两个*** SELECT语句中将它们保持相同的顺序。 – MatBailie

+0

非常感谢!这正在做我现在需要的。 – user10403

0

我认为UNION将忽略不匹配的列名,并根据它们在两个SELECT语句中出现的顺序排列列。

因此,只需在.fighter1.fighter2之间调换第二个SELECT即可。

0

尝试:

SELECT wp_ema_fights.fighter1 AS competitor, 
wp_ema_fights.fighter2 AS opponent, 
wp_ema_fights.winner AS winner 
FROM wp_ema_fights 
UNION ALL 
SELECT wp_ema_fights.fighter2 AS competitor, 
wp_ema_fights.fighter1 AS opponent, 
wp_ema_fights.winner AS winner 
FROM wp_ema_fights 
ORDER BY competitor 
1

除了Xophmester的回答,您可以用连接而不是UNION的做到这一点。这具有仅加载源数据一次而不是两次的优点。 (这是非常大的数据集,而不仅仅是小的更有意义。)

SELECT CASE WHEN Mode.ID = 1 THEN wp_ema_fights.fighter1 ELSE wp_ema_fights.fighter2 END AS competitor, 
     CASE WHEN Mode.ID = 2 THEN wp_ema_fights.fighter2 ELSE wp_ema_fights.fighter1 END AS opponent, 
     wp_ema_fights.winner AS winner 
FROM  wp_ema_fights 
CROSS JOIN (SELECT 1 as ID UNION ALL SELECT 2 as ID) AS Mode 
ORDER BY CASE WHEN Mode.ID = 1 THEN wp_ema_fights.fighter1 ELSE wp_ema_fights.fighter2 END 
0

如果你的SQL产品支持它,改变UNION ALLUNION CORRESPONDING

相关问题