2012-03-13 127 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  | 
+-------+--------+--------+ 

讓我知道,如果這有助於。