我对应用哪个联接以及在哪里感到有点困惑。
我有一个在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
答案 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:游戏可能有结果