有条件地选择 MYSQL 列

Posted

技术标签:

【中文标题】有条件地选择 MYSQL 列【英文标题】:Selecting MYSQL column conditionally 【发布时间】:2012-10-24 23:01:00 【问题描述】:

SQLFiddle 给出了我的问题的示例架构,如下所示:

CREATE TABLE `players` (
  `player1id` int(11) NOT NULL,
  `player2id` int(11) NOT NULL,
  PRIMARY KEY (`player1id`,`player2id`)
) ENGINE=InnoDB;

INSERT INTO `players` values
(1,5),
(1,7),
(5,3),
(5,4),
(2,1);

在在线游戏中,我想选择对手,可以是玩家player1idplayer2id

需要输入/输出示例

Input 1: Output 5, 7, 2
Input 5: Output 1, 3 ,4
& so on.

也就是说,所需的数据可以在任何列中,但我需要有条件或以任何其他方式在单列中输出。我听说过 mysql 条件列,但无法创建查询来获得所需的输出。有人可以帮助解决所需的查询。

编辑

基于this link,我运行以下查询但失败了。

SELECT IF(PLAYER1ID IS 1,PLAYER2ID as opponent,PLAYER1ID as opponent) 
FROM players
WHERE PLAYER1ID = 1 OR PLAYER2ID = 1;

【问题讨论】:

【参考方案1】:

我想你可以使用case when then 语法如下:

SELECT CASE WHEN player1id = 1 THEN player2id ELSE player1id  END
FROM players WHERE player1id =1 OR player2id=1;

或者:

SELECT CASE WHEN player1id = 1 THEN player2id WHEN player2id =1 THEN player1id  END
FROM players WHERE player1id =1 OR player2id=1;

【讨论】:

谢谢约根德拉。我尝试SELECT CASE WHEN player1id =1 THEN player2id WHEN player2id =1 THEN player1id END AS opponent FROM players WHERE player1id =1 OR player2id =1 根据您的回复添加列的自定义名称。完美。【参考方案2】:
select player1id from players where player2id=1
union
select player2id from players where player1id=1

SQL FIDDLE DEMO

【讨论】:

感谢阿南德,它的工作。但我更喜欢条件列和相关编辑部分的链接。也有可能吗? +1 寻求帮助和工作解决方案。 作为正当理由,我在架构中只给出了最小的示例,但我必须从多个表中选择数据并且需要选择至少 15-20 列。因此在union 之前和之后重复查询两次不是有效的方法。但是,感谢提出了另一种方法,我相信它在未来的某些其他情况下会对我有所帮助。 是的,你是对的。我以为只有 2 列所以给出了这个解决方案。【参考方案3】:

这应该会给你你正在寻找的东西:

SET @PlayerId = 1;
SELECT `player2id` AS 'Other Player ID'
  FROM `players`
 WHERE `player1id` = @PlayerId
   AND `player2id` != @PlayerId

 UNION
 SELECT `player1id`
  FROM `players`
 WHERE `player2id` = @PlayerId
   AND `player1id` != @PlayerId;


SET @PlayerId = 5;
SELECT `player2id` AS 'Other Player ID'
  FROM `players`
 WHERE `player1id` = @PlayerId
   AND `player2id` != @PlayerId

 UNION
SELECT `player1id`
  FROM `players`
 WHERE `player2id` = @PlayerId
   AND `player1id` != @PlayerId;

【讨论】:

谢谢亚历山大。我从您的回复中提取了@PlayerId 部分并将其添加到@Yogendra Singh 回复中。这将很有帮助,因为我们需要将变量放在接受答案的 4 个位置。

以上是关于有条件地选择 MYSQL 列的主要内容,如果未能解决你的问题,请参考以下文章

基于列值有条件地选择行

SQLAlchemy:如何根据其后端有条件地选择列的类型

比较两个(py)spark sql数据框并在保持连接列的同时有条件地选择列数据

有条件地选择 postgresQL 中的列

Mysql条件判断函数使用-选择两列中较大一列数据

如何有条件地从熊猫系列中选择项目