2016-08-03 5 views
0

私はSQLの練習問題をいくつか経験しています。私が現在困惑しているのは、最もロック・アルバムを数多く記録しているアーティストとアルバム数を選択するように求めています。一緒に質問をまとめる間に、私はロックアルバムの数で注文した問題に遭遇しました。結果はまだアーティストが注文したのではなくカウントされLIMITでORDER BYを使用すると、ORDER BYがクエリで正しく機能するのはなぜですか?

[["Alanis Morissette", "1"], ["Anne Murray", "1"], ["Billy Joel", "2"] ...  
["The Beach Boys", "1"], ["The Beatles", "7"], ["The Clash", "1"] ... 
["Trash Can Sinatras", "1"], ["Travis", "1"], ["U2", "2"], ["Van Morrison", "1"]] 

SELECT 
    a.artist, COUNT(DISTINCT a.asin) 
    FROM 
    albums a 
    JOIN 
    styles s ON a.asin = s.album 
    WHERE 
    s.style LIKE '%Rock%' 
    GROUP BY 
    a.artist 
    ORDER BY 
    COUNT(DISTINCT a.asin) DESC 

のようなものが得られます。しかし、私は、クエリに

LIMIT 1 

を追加する場合、ORDER BYは正解([「ビートルズ」、「7」])として適切に動作しているようだ唯一の答えとしてトップに途中から移動します産出した。

ここで何が起こっているのか説明してもらえますか?

注:私はコードはRubyで書かれていることを含め、以下の機能を介して実行すると便利かもしれないと考えている:

require 'pg' 

def execute(sql) 
    conn = PG::Connection.open(:dbname => 'sqlzoo') 
    query_result = conn.exec(sql).values 
    conn.close 
    query_result 
end 

はまた、これは、クエリのために使用されているテスト(RSpecの)です。

上記の結果は、このテストの結果であり、したがって配列の形式です。

+1

すべてがあなたの言ったとおりであれば、期待した結果が得られるはずです。ちょうど楽しみのために、カウントにエイリアスを付けて、そのエイリアスによって注文するとどうなりますか?: 'a.artist、COUNT(DISTINCT a.asin)をN FROM ........... ORDER BY N DESC'? – Lamak

+0

互換性のないデータベースタグを削除しました。実際に使用しているデータベースのタグを自由に追加してください。 –

+0

@Lamakエイリアスであっても、結果は依然としてアーティストによって注文されます。私には全く奇妙なようだ。 – charleszardo

答えて

2

これはORMの問題であり、SQLの問題ではありません。認識された問題は、この場合RSpecが失敗メッセージを出力する方法によるものです。

PostgreSQLでクエリを実行すると、正常に正常に動作し、期待どおりに動作しました。

正しい順序も右

expect(rock_superstars).to ... 

前に、テストブロックで結果をプリントアウトするときので問題はRSpecののcontain_exactlyとしなければならないようです見られています。失敗すると、クエリが生成する順序とは異なる並べ替え順序でactual collection contained:が出力されます。

関連する問題