对于这个新手问题,我深表歉意,但在过去的几个小时里,我一直在为一件再简单不过的事情而绞尽脑汁。
我有一个表(single_elim):
id_tournament phase player1 player2
1 1 1 2
1 1 3 4
1 1 5 10
我正在尝试编写一个查询,给定一个玩家给我他的对手。 不幸的是,我不知道玩家是在玩家 1 列还是玩家 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
并且我也尝试过我期望工作的不同类型的查询,我的结论是我缺少一些关于 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;
感谢任何帮助,非常感谢。
最佳答案
您观察到的行为看起来确实很奇怪,第一个 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 - Union all 似乎没有按预期工作。返回更少的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37470818/