内部联接 ?两栏的结果

时间:2015-10-13 17:54:02

标签: mysql join

我对应用哪个联接以及在哪里感到有点困惑。

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

它存储用户名,他们的猜测以及他们下注的游戏的最终结果

outcome_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'

然而,这不起作用,不确定,但我认为它不允许我将outcome_table.id加入两次到两个不同的列,但我想这样做,因为用户可能打赌赢了& #39;但结果“输了”#39;等

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

1 个答案:

答案 0 :(得分: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'

选择正确的加入

最常见的连接是LEFT和INNER。让我们说用户已经下了赌注,但是足球比赛(或其他什么)还没有完成,那么你在outcome_table中的排名是否正确?游戏尚未结束,结果将会延迟。

如果您使用INNER JOIN,则对于未完成的游戏,outcome_table中的行不会匹配 --- INNER JOIN需要匹配

如果您想在比赛开始之前看到投注,可以使用LEFT JOIN。 LEFT JOIN不会删除没有任何结果的行,用户仍然会列出 --- LEFT JOIN不关心

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