2017-02-07 5 views
-3

У меня возникла следующая проблема:Получить определенный результат запроса из двух разных таблиц mysql

Я пытаюсь реализовать систему достижений. У меня две таблицы. Таблица 1 содержит достижения_id и достижение_info. В таблице 2 приведена ссылка на пользователя, то есть достижения_id и player_id, чтобы вы могли узнать, какой пользователь достиг определенных вещей.

Я пытаюсь написать метод, который возвращает мне все достижения, но дополнительно флаг, который говорит мне, если какой-то пользователь достиг этой строки или нет. Например: getPlayerAchievements (playerid) -> возвращает список достижений с id, info и bool, независимо от того, достиг ли пользователь.

таблица 1:

achievement_id|achievement_info 
1    |info1 
2    |info2 
3    |info3 

Таблица 2:

achievement_id|player_id; 
1    |15 
3    |15 

результат мне нужно, введя player_id "15":

achievement_id|achievement_info|(bool)achieved 
1    |info1   |true 
2    |info2   |false 
3    |info3   |true 

У меня уже есть класс достижение так Мне просто нужно заполнить их моими данными.

Я мог бы всегда использовать два отдельных sql-запроса для достижения этого, но я подумал, что, возможно, был способ упростить его, поскольку я использую php для получения моих данных и не хочу двух соединений и запросов в одном скрипте php.

+3

Редактировать свой вопрос и предоставить образцы данных и желаемые результаты. –

ответ

0

Вы хотите выбрать все записи из таблицы achievemets и показать их. Это легкая часть :-) Для каждой записи вы хотите показать, достиг ли игрок 1234 этого достижения. Вы можете сделать это с EXISTS пункта:

select 
    achievement_id, 
    achievement_info, 
    exists 
    (
    select * 
    from players p 
    where p.player_id = 1234 
     and p.achievement_id = a.achievement_id 
) as achieved 
from achievements a; 

Или еще проще с IN:

select 
    achievement_id, 
    achievement_info, 
    achievement_id in (select achievement_id from players where player_id = 1234) as achieved 
from achievements; 
+0

Благодарим за ответ! это сделало работу! – DrSkyer

0

Вы можете использовать left join, чтобы получить полный список достижений и сопоставления записей из таблицы достижений пользователя:

select t1.achievement_id, t1.achievement_info, (t2.achievement_id is null) as achieved 
from table1 t1 
left join table2 t2 on t1.achievement_id=t2.achievement_id and t2.player_id=15 
+0

... если в таблице нет нескольких достижений на пользователя (т. Е. Если достижение достижений_id + player_id уникально в таблице достижений). В противном случае вам, возможно, придется избавиться от дубликатов. –

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