通过嵌套表获得最低排名的记录,并按MYSQL分组

时间:2018-01-16 17:42:06

标签: mysql

我有一个查询问题,我之前用2个表和不同的数据库结构解决了,现在我有3个表,我无法得到正确的结果

leads table - regular leads table with id, firstname, etc...

statuses table - id, lead_id, brand_id, map_id 
lead_id is relationship key for id in lead 
map_id is relationship key for map_keys table

map_keys table - id, name, rank

规则: 每个潜在客户可以拥有多个状态,也可以没有状态

即使同一个潜在客户有两种或更多种状态,查询也应仅打印最低状态

示例:

lead: id = 3, 
statuses: id = 7, lead_id = 3, map_id = 5
and another record: 
statuses: id = 10, lead_id = 3, map_id = 1

map_keys: 
id = 5, rank = 5
id = 1, rank = 1 

in the result I should get 
lead_id = 3, map_id = 1 

过去我在状态表中排名,所以我的解决方案是

SELECT  IF(s2.rank IS NULL, s.rank, s2.rank) AS rank  FROM `leads` l 
LEFT JOIN statuses s ON s.lead_id = l.id
LEFT JOIN statuses s2 ON s2.lead_id = s.lead_id AND s.rank > s2.rank
GROUP BY l.id

但是使用新的数据库结构我无法得到正确的结果,我希望我的问题是可以理解的,如果不是,我会尽力解释它,谢谢!

1 个答案:

答案 0 :(得分:0)

我解决了我的问题,我的最终查询是

SELECT * FROM leads                                                                                                 
LEFT JOIN (                                                                                                 
SELECT lead_id, mk.name, mk.rank FROM `statuses` s                                                                                                  
JOIN map_keys mk ON mk.id = s.map_id                                                                                                    
JOIN statuses_maps sm ON sm.id = s.status_id                                                                                                    
ORDER BY rank  ASC ) as s ON lead_id = lead.id                                                                                                  
GROUP BY leads.id