我有两个表,Alliance(a)和Alliance_user(au)维护在线游戏中用户和盟友之间的关系。
联盟表的主键在Alliance_user表中被引用,并且可能出现多次。示例:
a.id | a.name | au.id | au.username | au.user_role
-----+-----------------+-------+-------------+------------------------
1 | First Alliance | 1 | JohnnyA | Alliance Founder
1 | First Alliance | 2 | JohnnyA | Trusted Alliance Member
2 | Second Alliance | 3 | JohnnyB | Alliance Founder
3 | Third Alliance | 4 | JohnnyC | Trusted Alliance Member
我的查询当前如下所示:
SELECT `a`.`id`, `a`.`name`, `au`.`id`, `au`.`username`, `au`.`user_role`
FROM `alliance` `a`
INNER JOIN `alliance_user` `au` ON `au`.`alliance_id` = `a`.`id`
WHERE `au`.`username` = 'JohnnyA'
AND `au`.`user_role` IN('Alliance Founder', 'Trusted Alliance Member')
我得到了这个(根据我的查询是正确的):
a.id | a.name | au.id | au.username | au.user_role
-----+-----------------+-------+-------------+------------------------
1 | First Alliance | 1 | JohnnyA | Alliance Founder
1 | First Alliance | 2 | JohnnyA | Trusted Alliance Member
但是我想要这个:
a.id | a.name | au.id | au.username | au.user_role
-----+-----------------+-------+-------------+-----------------
1 | First Alliance | 1 | JohnnyA | Alliance Founder
但是对于JohnnyC,我想得到这个:
a.id | a.name | au.id | au.username | au.user_role
-----+-----------------+-------+-------------+------------------------
3 | Third Alliance | 4 | JohnnyC | Trusted Alliance Member
由于他不是联盟创始人,但仍然有权查看所请求的信息。
可以问这个问题,JohnnyA是否不应该在他的联盟中扮演独特的角色,这是一个有效的问题,我仍然可以照此实施,但对我而言,更多的是了解我是否想要可以在单个查询中执行操作,而不必随后使用PHP处理数据?
答案 0 :(得分:1)
您可以尝试使用基于au.user_role的FIELD订单 并限制为1
SELECT `a`.`id`, `a`.`name`, `au`.`id`, `au`.`username`, `au`.`user_role`
FROM `alliance` `a`
INNER JOIN `alliance_user` `au` ON `au`.`alliance_id` = `a`.`id`
WHERE `au`.`username` = 'JohnnyA'
AND `au`.`user_role` IN('Alliance Founder', 'Trusted Alliance Member')
ORDER BY FIEDL(au.user_role ,'Alliance Founder' , 'Trusted Alliance Member')
LIMIT 1