SQL查询以选择每个组的最大值/最大值

时间:2019-05-17 22:53:10

标签: mysql sql greatest-n-per-group

我有一个现有的SQL查询,需要添加条件。 我正在SequelPro 1.0.2中对此进行测试。

这是现有查询的样子:

SELECT distinct c.cue_id, c.*, cat.cat_name, s.style_name, t.tempo_name  
FROM cues c 
left join categories cat on c.cat_id = cat.cat_id 
left join styles s on c.style_id = s.style_id 
left join tempos t on c.tempo_id = t.tempo_id 
inner join master_cue_id m on m.cue_id = c.cue_id    
WHERE  ( (c.key_id_arry LIKE '%108500%' ) ) 
AND c.cue_status = 'Active' 
ORDER BY (
  CASE WHEN (key_id_arry LIKE '108500,%' OR key_id_arry LIKE '%,108500' OR key_id_arry LIKE '%,108500,%') 
THEN 1 ELSE 2 END), c.cue_rating DESC, c.cue_title, c.cue_trk_num ASC

以下是我需要添加的条件:

提示表上有一列称为cue_rating(INT 0-10)。 我需要返回单个评分最高的提示PER master_cue_id(每个master_cue_id大约有四到五个cue_id)。

如果cue_ratings相同,则需要获得最低的cue_id。

这是到目前为止我尝试过的。

SELECT distinct c.cue_id, c.*, cat.cat_name, s.style_name, t.tempo_name  
FROM cues c 
left join categories cat on c.cat_id = cat.cat_id 
left join styles s on c.style_id = s.style_id 
left join tempos t on c.tempo_id = t.tempo_id 
inner join master_cue_id m on m.cue_id = c.cue_id   
INNER JOIN 
  (SELECT MAX(c2.cue_rating) AS MaxCueRating, MIN(c2.cue_id) AS MinId, m2.master_cue_id 
  FROM cues c2 
  INNER JOIN master_cue_id m2 
  ON m2.cue_id = c2.cue_id 
  GROUP BY m2.master_cue_id) maxratedcues 
ON m.master_cue_id = maxratedcues.master_cue_id 
AND c.cue_rating = maxratedcues.MaxCueRating   
WHERE  ( (c.cue_desc LIKE '%futurebass%') ) and  c.cue_status = 'Active' 
GROUP BY m.master_cue_id 
ORDER BY (CASE WHEN (key_id_arry LIKE '108500,%' OR key_id_arry LIKE '%,108500' OR key_id_arry LIKE '%,108500,%') 
THEN 1 ELSE 2 END), c.cue_rating DESC, c.cue_title, c.cue_trk_num ASC

我希望每个master_cue_id都能获得最高评分的提示。结果数量是正确的,但是我没有得到最高评价的提示。

我什至尝试简化查询,使其只返回每个master_cue_id最高评分的提示,而不使用关键字搜索查询:

SELECT * FROM cues
INNER JOIN master_cue_id m
ON cues.cue_id = m.cue_id
WHERE cue_rating = 
    (SELECT MAX(c.cue_rating) 
    from cues as c 
    INNER JOIN master_cue_id m2 
    ON m2.cue_id = c.cue_id 
    WHERE cues.cue_id = c.cue_id
    )
    GROUP BY m.master_cue_id

具有讽刺意味的是,这似乎返回了一些最高评分的线索(如果它们都具有相同的评分),但实际上却返回了最低评分的线索。

编辑:SQLFIDDLE

0 个答案:

没有答案