2012-03-13 90 views
0

我需要从下表中选择“捆绑”条目,但仅当捆绑包存在其他明智的选择轨道1从每个版本。每个版本都有一个独特的“cat_no”,这就是为什么我需要使用GROUP BY。MYSQL GROUP BY和ORDER BY与ABS

SELECT * FROM cds 
WHERE genre='rock' 
GROUP BY cat_no 
ORDER BY ABS(track) DESC 
LIMIT 0,3 

这是我所尝试过的,但有时在该版本的软件包中有时会获得第1个轨道。

genre cat_no track 
rock 001  1  
rock 001  2  
rock 001  bundle 
rock 002  1  
rock 002  2  
rock 002  bundle 
rock 003  1  
rock 003  2  

回答

1

尝试分组之前记录进行排序 -

SELECT * FROM 
    (SELECT * FROM cds WHERE genre = 'rock' ORDER BY IF(track = 'bundle', 0, 1)) t 
GROUP BY 
    cat_no; 
+0

谢谢你的工作,但你能解释't'是什么,我假设track ='bundle',0,1是一个优先顺序? – user1209203 2012-03-13 14:59:31

+0

1.'t'是一个子查询别名(MySQL需要它); 2.是的,IF(...)用于将“捆绑”放在其他卡车号码之前。 – Devart 2012-03-13 15:25:43

+0

谢谢我会阅读sub-queires – user1209203 2012-03-13 16:14:31

0

试试这个:

select genre, cat_no, max(track) from t 
where track in ('1', 'bundle') 
group by genre, cat_no 

我们实际上采取的顺序( '捆绑' 的优势出现在'1'之后)。我不明白道路上的ABS ......它的目的是什么?

鉴于你的数据。例如,以前的查询将导致:

+-------+--------+--------+ 
| GENRE | CAT_NO | TRACK | 
+-------+--------+--------+ 
| rock |  1 | bundle | 
| rock |  2 | bundle | 
| rock |  3 | 1  | 
+-------+--------+--------+ 

让我知道,如果这有助于。