2012-11-05 134 views
4
我的问题

示例模式在SQLFiddle和如下给出:选择MYSQL列有条件

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; 

回答

5

我想你可以使用如下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; 
+0

谢谢Yogendra。我试着去'SELECT CASE WHEN player1id = 1 THEN player2id WHEN player2id = 1 THEN player1id 结束,因为对手 从球员 WHERE player1id = 1 OR player2id = 1'基础上添加您的回复栏的自定义名称。完善。 –

+0

@KapilSharma:感谢分享。很高兴知道,它的工作。 –

3
select player1id from players where player2id=1 
union 
select player2id from players where player1id=1 

SQL FIDDLE DEMO

+0

感谢Anand,它的工作。但我更喜欢有条件的列和有问题的编辑部分的链接。它也有可能吗? +1寻求帮助和工作解决方案。 –

+0

就像理由一样,我在模式中只给出了最小的例子,但我必须从多个表中选择数据,并且需要选择至少15-20列。因此,在'union'之前和之后重复查询两次并不是有效的方式。不过,多亏了我提出了另一种方法,我相信在未来的其他情况下,这对我会有所帮助。 –

+0

是的,你说得对。我认为只有2栏给了这个解决方案。 – AnandPhadke

2

这应该给你你在做什么looki ng用于:

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; 
+0

谢谢亚历山大。我从你的回复中拿出了@ @ PlayerId'部分,并将它添加到@Yogendra Singh的回复中。这将是有益的,因为我们需要将变量放在4个接受答案的地方。 –