MySQL-连接返回“首选行”

时间:2020-05-10 18:21:46

标签: mysql

我有两个表,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处理数据?

1 个答案:

答案 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