Union all 似乎没有按预期工作。返回更少的行
Posted
技术标签:
【中文标题】Union all 似乎没有按预期工作。返回更少的行【英文标题】:Union all doens't seem to be working as expected. Returning less rows 【发布时间】:2016-05-26 20:55:15 【问题描述】:很抱歉这个新手问题,但在过去的几个小时里,我一直在为一件再简单不过的事情而烦恼。
我有一张桌子(single_elim):
id_tournament phase player1 player2
1 1 1 2
1 1 3 4
1 1 5 10
我正在尝试编写一个查询,给定一名玩家给我他的对手。 不幸的是,我不知道玩家是在 player1 列还是 player 2 列(但我知道它们是互斥的)列,所以我希望一个可能的解决方案是:
SELECT p AS opponent FROM (
(
SELECT player1 as p FROM single_elim
WHERE
id_tournament = 1 AND
phase = 1 AND
player2 = 4
) UNION ALL (
SELECT player2 as p FROM single_elim
WHERE
id_tournament = 1 AND
phase = 1 AND
player1 = 4
)
) x;
但是该语句返回 0 行。
如果我运行单个语句:
SELECT player1 as p FROM single_elim
WHERE
id_tournament = 1 AND
phase = 1 AND
player2 = 4
假设 player2 将在第 4 列,那么它可以工作,我得到 p = 3 的单行结果。
我也尝试过UNION
,并且我还尝试过我希望能够工作的不同类型的查询,我的结论是我缺少一些关于联合工作原理的基本知识,但是经过一些研究我还没有设法弄清楚出来吧。
另一个单独工作但不能与联合一起工作的查询示例是:
SELECT * FROM (
SELECT COUNT(*) as n, player2 as p FROM helper
WHERE id_tournament = 1 AND player1 = 4 AND phase = 1
) UNION ALL (
SELECT COUNT(*) as n, player1 as p FROM helper
WHERE id_tournament = 1 AND player2 = 4 AND phase = 1
)
) x WHERE n = 1;
感谢任何帮助,非常感谢。
【问题讨论】:
【参考方案1】:您观察到的行为确实很奇怪,第一个 UNION 应该返回一行。 (数据值是整数类型还是字符串类型?)
但是,除非这是一个需要尽可能优化索引使用的巨大表,否则您不应该需要 UNION。
SELECT CASE WHEN player1 = 4 THEN player2 ELSE player1 END as p
FROM single_elim
WHERE id_tournament = 1
AND phase = 1
AND (player1 = 4 OR player2 = 4)
;
【讨论】:
这些值都是整数。是的,您的解决方案有效!它似乎更加优雅。多谢。我认为这一定是 mysql 5.6 中的一个错误,但没有发现任何关于它的迹象,这真的很奇怪。【参考方案2】:我认为括号搞砸了。无论如何,您不需要包装选择查询,联合就足够了。这个效果很好:
SELECT player1 as p FROM single_elim
WHERE
id_tournament = 1 AND
phase = 2 AND
player2 = 4
UNION ALL
SELECT player2 as p FROM single_elim
WHERE
id_tournament = 1 AND
phase = 2 AND
player1 = 4;
【讨论】:
以上是关于Union all 似乎没有按预期工作。返回更少的行的主要内容,如果未能解决你的问题,请参考以下文章