我认为您在示例中犯了一个错误(当您有 101,102,105 时选择了 102 与您的书面描述不符) - 但您正在寻找的是group by
在您加入后并使用聚合函数(max
)来选择您的最大值角色. 就像是:
SELECT t.ticket_id, u.user_id, max(rm.role_id)
FROM tickets t
JOIN users u on u.user_id = t.user_id
JOIN role_mappings rm on rm.user_id = u.user_id
WHERE ...
GROUP BY t.ticket_id, u.user_id
如果您想要一行中的所有角色,请查看GROUP_CONCAT
更新
为了满足角色102
优先的要求,一种方法是排除具有角色 102 的票证用户的结果,然后在第二个查询中使用union
像这样的东西:
SELECT t.ticket_id, u.user_id, max(rm.role_id)
FROM tickets t
JOIN users u on u.user_id = t.user_id
JOIN role_mappings rm on rm.user_id = u.user_id
WHERE u.user_id NOT IN (
SELECT t.ticket_id, u.user_id, max(rm.role_id)
FROM tickets t
JOIN users u on u.user_id = t.user_id
JOIN role_mappings rm on rm.user_id = u.user_id
WHERE rm.role_id = 102)
GROUP BY u.id
UNION ALL
SELECT t.ticket_id, u.user_id, rm.role_id
FROM tickets t
JOIN users u on u.user_id = t.user_id
JOIN role_mappings rm on rm.user_id = u.user_id
WHERE rm.role_id=102
在没有门票表的情况下在这里摆弄:http ://sqlfiddle.com/#!2/cc1c6/5