2012-03-13 23 views
0

以下の表から "bundle"エントリを選択する必要があります。各リリースには独自の「cat_no」があります。なぜなら、私はGROUP BYを使用する必要があるからです。MYSQL GROUP BYとORDER BY with 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'が何であるのか説明できますか?トラック= 'bundle'と仮定しています.0,1は優先順位ですか? – user1209203

+0

1. 't'はサブクエリエイリアスです(MySQLはそれを必要とします)。 2.はい、IF(...)を使用して他の「トラック」番号の前に「バンドル」を配置します。 – Devart

+0

ありがとう、私はサブキーレで読んでよ – user1209203

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  | 
+-------+--------+--------+ 

:あなたの例のデータを考えると

、前のクエリがもたらすであろう。