2015-10-13 5 views
1

Я немного смущен, о том, к чему присоединиться и где.INNER JOIN? результаты по двум столбцам

У меня есть база данных mysql, которая делает ставки в IRC-клиенте.

Он хранит имена пользователей, их догадку и в конечном итоге исход игры они делают ставку на

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

EDIT:

В конце концов я использовал два отдельных псевдонима для каждого соединения, которое похоже на работу; вот код из фактической таблицы, которая работает, а не приведенный выше пример.

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

Спасибо, но я смотрел на эту самую диаграмму venn часами и до сих пор не могу понять, как получить результат, как выше. – 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' 

Выберите правильный присоединиться

Наиболее распространенным присоединяется оставляется и ВНУТРЕННИЙ. Допустим, что пользователи поставили свои ставки, но футбольная игра (или что-то еще) еще не закончена, то у вас не будет строки в результатах_table справа? Игра не закончена, поэтому результаты придут позже.

Если вы используете INNER JOIN, строка в outcomes_table не будет соответствовать для незавершенных игр
--- INNER JOIN требует матчей.

Если вы хотите увидеть ставки еще до начала игры, вы можете использовать LEFT JOIN. LEFT JOIN не удалит строки, которые не получили никакого результата, пользователи все равно будут перечислены
--- LEFT JOIN не заботится.

INNER JOIN: Игра должна иметь результат
LEFT JOIN: Игра может иметь результат

+0

Спасибо, LEFT JOIN - хороший совет, и я буду использовать его, но с точки зрения получения выигрыша/проигрыша от идентификатора результата, связанного с guess_id, и результата, я не уверен, что этот код делает это. – user3406725

+0

В конце концов я получил запрос, который работает, я не уверен, как и почему он жаловался, прежде чем я закончил использовать два разных псевдонима для двух идентичных таблиц результатов, и он вернул данные, как указано выше. – user3406725

+0

Спасибо за помощь, t отметьте это как правильное, но я дам вам верх. – user3406725

Смежные вопросы