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 似乎没有按预期工作。返回更少的行的主要内容,如果未能解决你的问题,请参考以下文章

All 子句核心数据谓词未按预期工作

Zend 框架 - ErrorHandler 似乎没有按预期工作

Chrome devtools 没有显示更少的文件

如何仅在没有子查询的 UNION ALL 中按一个查询排序

冻结 Python 应用程序时创建的文件更少

For循环没有给出预期的重复