mysql - Union all 似乎没有按预期工作。返回更少的行

标签 mysql database union union-all

对于这个新手问题,我深表歉意,但在过去的几个小时里,我一直在为一件再简单不过的事情而绞尽脑汁。

我有一个表(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/

相关文章:

java - 登录表单 java mysql 在 netbeans 上失败

database - 如何获取在 Sonar 中引入违规的用户的详细信息?

php - 如何在 union 上更新

vb.net - 为什么 LINQ 中的 Union 函数不删除重复条目?

mysql - 无法通过 FreeBSD 上的套接字 '/tmp/mysql.sock' (38)' 连接到本地 MySQL 服务器

mysql - SQL 百分比 SUM 不同于 100

sql - 如何从包含单引号的oracle数据库中搜索数据

mysql - 仅当语句为 true 时才插入

sql - 在 UNION 中排序

mysql - Mysql召唤订单总数