【问题标题】:Union all doens't seem to be working as expected. Returning less rowsUnion all 似乎没有按预期工作。返回更少的行
【发布时间】: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;

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

【问题讨论】:

    标签: mysql database union union-all


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2020-09-15
      • 2016-01-24
      • 1970-01-01
      • 2022-12-17
      • 2021-06-07
      • 2013-02-10
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多