2011-02-06 11 views
1

銀行が複数の支店(branches.bank_id)を持つ銀行と支店のカタログを作成しようとしているとします。各ブランチにはawesomeness factor branches.awesomenessがあります。GROUP BYに「最も早い」結果を選択させるにはどうすればよいですか?

最小限のブランチでソートされたバンクのリストを返すクエリをどのように構造化しますか?

私は、次のしている:

SELECT * FROM `banks` 
    INNER JOIN `branches` ON `branches`.`bank_id` = `banks`.`id` 
    GROUP BY `banks`.`id` 
    ORDER BY `branches`.`awesomeness` ASC; 

私はこれをしようとすると、情報任意の銀行でグループ化されます分岐が結果に最も早く現れる一つである(少なくとも素晴らしい分岐ではありませんGROUP BYステートメントを削除してください)。

どうすればいいですか?これは、ARELスタイルの構文を使用するか考慮Railsの固有の要件に取り、中のものを投げる気軽にする方が便利ですので、もし、Railsので行くことを意図している

+0

あなたのスキーマと期待された結果のいくつかをもっと見せてもらえれば、私は「最も早い」とはどういう意味ですか?時間/日付?または何? – Jakub

答えて

3

なぜ私は理解していませんブランチデータも取得したい場合は、GROUP BYを使用します。 はあなたのクエリからGROUP BYを外し、にソートを更新:あなたはgrouppingにinsinst場合 ORDER BY branches.bank_id, branches.awesomeness

、各グループの少なくとも素晴らしさを得るためにMIN()集計関数を使用します。

ORDER BY MIN(branches.awesomeness) ASC;


更新:あなたは、両方のハイブリッドをしたい、と彼ら自身素晴らしさで、銀行に「少なくとも素晴らし」と支店で銀行をソートしたい場合は、このクエリを使用します。

SELECT b.*, r.*, brs.MinAw 
FROM banks b 
    INNER JOIN branches r ON r.bank_id = b.id 
    INNER JOIN (
     SELECT bank_id, MIN(awesomeness) MinAw 
     FROM branches 
     GROUP BY bank_id 
    ) brs ON b.id = brs.bank_id 
ORDER BY brs.MinAw, r.awesomeness; 
+0

ありがとう、スクラムマイスターさん。集約関数は私がまだ頭を抱くようになっています。あなたの推奨事項はうまくいくようです。私はまたあなたの評価に完全に同意します。私はその質問が示唆していることを考えれば、グループ分けは必要ではないということです。質問のための私の本当の目的は、グループ分けが有用である(つまり、質問者が各銀行のうちの1つだけを期待している)ことであり、私はグループ分けを求めていると主張するよりも、それ。 –

+1

@ steven-xuグループを使用している場合は、グループをソートする必要があることを暗示しますが、個人はグループ内で自分自身を分けていますが、ソートする必要はありません。そのためには 'MIN'関数を使用します。 '*'を選択しているので、クエリが適切にソートされている間、返される**ブランチ**の行は各バンクごとにランダムになります( 'bank'でグループ化しているので「ブランチ」を選択する)。 –

+0

ネストされたクエリスタイルを使用して最小awesomenessを生成することと、選択パラメータの中に単に 'MIN(awesomeness)を含めることの違いは何ですか? –

0

多分?

select DISTINCT bank_id from branches 
ORDER BY awesomeness desc; 
1

スクラムマイスターの答えへの補足:

  • は、構文は親から子へレコードを結合して、子供が親レコードに関連する複数のレコードができたときに、JOIN - 」あなたを重複があります。

  • DISTINCTは、削除するためにDISTINTの行全体を複製する必要があるため、関連するすべてのテーブルからすべての列を選択すると役立ちません。この例では、各行ごとに異なる分岐情報があります。

  • MySQLのGROUP BYサポートの列を省略すると、これをサポートするほとんどのデータベースでは松葉杖として使用されるため、SQL Server、Oracle、PostgreSQLに移行すると動作しません。MySQLのGROUP BYサポートは、GROUP BYで定義されていない列の値であり、集計関数内では定義されていません。任意の値になります。データセットが大きいほど、同じ出力を一貫して保証する可能性は低くなります。

+0

私はPostgreSQLに移行しようとしていますが、3番目の点が非常に正しいことがわかります。私はまだこの機能をpsqlを使ってスコープとして動作させることはできません。 –

+0

@Steven Xu:PostgreSQL 8.4以降の場合は、ROW_NUMBER()を使用して書き直してください(悲しいことに、MySQLがサポートしていない解析関数)。 –

+0

すみません。 ROW_NUMBERを使用するヒントの意味を詳しく説明できますか?私はドキュメンテーションを見上げましたが、現在の質問には関係していません。 –

関連する問題