联盟所有似乎都没有按预期工作。返回较少的行

时间:2016-05-26 20:55:15

标签: mysql database union union-all

很抱歉这个新手问题,但过去几个小时我一直在用一些简单的东西撕掉我的头发。

我有一张桌子(single_elim):

\> let a = 42 :: Int
\> let b = 100.0 :: Double

\> "string: " ++ cast a  -- Int -> String
"string: 42"

\> b * cast a            -- Int -> Double
4200.0

我想写一个给玩家给我他的对手的查询。 不幸的是我无法知道玩家是在播放器1列还是播放器2(但我知道它们是互斥的)列,所以我希望有一个可能的解决方案:

id_tournament   phase   player1    player2
    1             1        1         2
    1             1        3         4
    1             1        5         10

但是语句返回0行。

如果我运行单一陈述:

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;

假设player2将在第4列,那么它可以工作,我得到一行p = 3的结果。 我也尝试了SELECT player1 as p FROM single_elim WHERE id_tournament = 1 AND phase = 1 AND player2 = 4 ,我也尝试了不同类型的查询,我本来期望它可以工作,我的结论是我错过了一些关于工会如何工作的基本原则,但是经过一些研究我还没有管理过弄明白。

另一个单独工作但不与工会合作的例子是:

UNION

感谢任何帮助,非常感谢。

2 个答案:

答案 0 :(得分:0)

您观察的行为确实很奇怪,第一个UNION应该返回一行。 (数据值是整数类型还是字符串类型?)

但是,你不应该需要UNION,除非这是一个巨大的表格,你需要尽可能地优化索引的使用。

DelegatingDataSource

答案 1 :(得分:0)

我认为括号搞乱了。无论如何,你不需要包装选择查询,联合就足够了。这个很好用:

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;