2015-10-13 100 views
1

我对要应用哪个连接以及在哪里有点困惑。INNER JOIN?两列结果

我有一个在IRC客户端投注的mysql数据库。

它存储了用户名,他们的猜测,他们对

的outcomes_table赌比赛的最终结果是这样的

+--------------+ 
| id outcome | 
+--------------+ 
| 1 win  | 
| 2 lose | 
+--------------+ 

的USER_TABLE是这样

+----+----------+----------+-------------------+ 
| id | username | guess_id | bettingsession_id | 
+----+----------+----------+-------------------+ 
| 1 | name1 |  1 |     1 | 
| 2 | name2 |  1 |     2 | 
| 3 | name3 |  2 |     2 | 
    4 name1    1     2 
+----+----------+----------+-------------------+ 

的betting_session_table是这样的:

+----+---------+ 
| id | result | 
+----+---------+ 
| 1 |  1 | 
| 2 |  2 | 
+----+---------+ 

我希望得到一个用户的投注列表以及它们的猜测加盟的成果和结果加入到

如: 选择每行一个不同的赌注用户名,猜(赢/输)结果(赢/输)

喜欢的东西:

SELECT * 
FROM user_table 
INNER JOIN betting_session_table ON bettingsession_id = betting_session_table.id 
INNER JOIN outcomes_table ON guess_id = outcomes_table.id 
INNER JOIN outcomes_table ON result = outcomes_table.id 
WHERE username = 'name1' 

但是这不工作,不知道,但我不认为它让我加入outcomes_table.id两次,以两个不同的列,但我想要这个,因为用户可能会打赌'赢',但导致'输'等。

EG:我想回到

+----+----------+----------+----+---------+--------------------+----+--------+----+---------+ 
| id | username | guess_id | id | outcome | betting_session_id | id | result | id | outcome | 
+----+----------+----------+----+---------+--------------------+----+--------+----+---------+ 
| 1 | name1 |  1 | 1 | win  |     1 | 1 |  1 | 1 | win  | 
| 4 | name1 |  1 | 1 | win  |     2 | 2 |  2 | 2 | lose | 
+----+----------+----------+----+---------+--------------------+----+--------+----+---------+ 

编辑:

在我用于每个加入的似乎工作两个独立的别名结束;这里是来自实际表格的代码,而不是上面的剪切示例。

SELECT * 
FROM `xcoins_betting_log` A 
LEFT JOIN `xcoins_betting_session` B ON A.betting_session_id = B.id 
LEFT JOIN `xcoins_common_tables`.`xcoins_betting_outcomes` C ON A.guess_id = C.id 
LEFT JOIN `xcoins_common_tables`.`xcoins_betting_outcomes` D ON B.outcome_id = D.id 
WHERE `user_id` =9 
+0

“并将结果加入到......” ????有点不清楚你想要什么 – Marusyk

+0

[This](http://stackoverflow.com/questions/448023/what-is-the-difference-between-left-right-outer-and-inner-joins)解释了区别在内,外,左,右,全外... – SebHallin

+0

谢谢,但我一直在盯着那非常相同的维恩图几个小时,仍然不能解决如何得到像上面的结果。 – user3406725

回答

0

我不知道这是你想要的,但我希望如此。

SELECT 
    usr.*, 
    res.outcome, 
    IF(res.id = usr.guess_id, 'User win', 'User lose') AS result 
FROM user_table AS usr 
INNER JOIN betting_session_table AS bet ON 
    bet.id = usr.bettingsession_id 
INNER JOIN outcomes_table AS res ON 
    res.id = bet.result 
WHERE usr.username = 'name1' 

选择正确的连接

最常见的连接是左,INNER。比方说用户已经下注了,但足球比赛(或其他)还没有完成,那么你将不会在outcome_table中拥有这一行吗?游戏还没有结束,所以结果会晚一些。

如果使用INNER JOIN,在outcomes_table行不匹配的未完成的游戏
--- INNER JOIN需要匹配

如果你想在游戏开始前看到投注,你可以使用LEFT JOIN。左连接不会删除没有任何结果的行,用户仍将列出
---左连接不关心

INNER JOIN:游戏必须有结果
LEFT JOIN:游戏可能有结果

+0

感谢LEFT JOIN是一个很好的建议,我将使用它,但是从结果ID被加入到guess_id和结果中获取输赢的方面,我不确定上面的代码是否会这样做。 – user3406725

+0

最后我得到了一个可以正常工作的查询,我不确定它在为两个相同的结果表使用两个不同的别名之前如何或为什么会投诉,并返回上述数据 – user3406725

+0

感谢您的帮助, t标记这是正确的,但我会给你一个upvote。 – user3406725