我遇到以下问题:
我尝试实现一个成就系统。我有两张桌子。表1包含achievement_id和achievement_info。表2包含指向用户的链接,即achievement_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脚本中使用两个连接和查询
答案 0 :(得分:0)
您想从Achiemets表中选择所有记录并显示它们。这很简单:-)对于你想要显示的每个记录,玩家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;
答案 1 :(得分: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