2016-08-03 39 views
0

Ich gehe durch einige SQL-Übungsprobleme. Der eine, den ich derzeit verblüffe, fragt nach dem Künstler, der die meisten Rockalben aufgenommen hat, sowie nach der Anzahl der Alben. Während ich Stück für Stück die Frage zusammenstellte, stieß ich auf ein Problem, das nach der Anzahl der Rockalben geordnet war.Warum funktioniert ORDER BY nur ordnungsgemäß in meiner Abfrage bei Verwendung mit LIMIT?

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 

Renditen etwas wie:

[["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"]] 

Die Ergebnisse von Künstler noch bestellt werden, statt zu zählen. Allerdings, wenn ich

LIMIT 1 

auf die Abfrage hinzuzufügen, scheint ORDER BY richtig als die richtige Antwort zu arbeiten ([ "The Beatles", "7"]) bewegt sich von der Mitte nach oben als die einzige Antwort, die ist ergeben.

Könnte jemand bitte erklären, was hier vor sich geht?

HINWEIS: Ich glaube, es könnte hilfreich sein, zu schließen, dass der Code in Ruby geschrieben und durch die folgende Funktion ausführen:

require 'pg' 

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

Dies ist auch der Test (RSpec) für die Abfrage verwendet werden:

describe "rock_superstars" do 
    it "selects the name of the most prolific rock artist" do 
    expect(rock_superstars).to contain_exactly(
     ["The Beatles", "7"] 
    ) 
    end 
end 

Die obigen Ergebnisse sind die Ausgabe dieses Tests, daher die Form eines Arrays.

+1

Wenn alles wie gesagt ist, sollten Sie Ihre erwarteten Ergebnisse erhalten. Nur zum Spaß, was passiert, wenn Sie der Zählung einen Alias ​​geben und nach diesem Alias ​​sortieren ?: SELECT a.artist, COUNT (DISTINCT a.asin) als N FROM ........... ORDER BY N DESC? – Lamak

+0

Ich entfernte die inkompatiblen Datenbank-Tags. Fühlen Sie sich frei, das Tag für die Datenbank hinzuzufügen, die Sie wirklich verwenden. –

+0

@Lamak sogar mit dem Alias, die Ergebnisse werden immer noch von Künstler bestellt. Es scheint mir völlig bizarr. – charleszardo

Antwort

2

Dies ist ein ORM-Problem, kein SQL-Problem. Das erkannte Problem ist darauf zurückzuführen, dass RSpec in diesem Fall die Fehlernachricht druckt.

Das Ausführen der Abfrage über PostgreSQL funktionierte einwandfrei und wie erwartet.

Die richtige Reihenfolge ist auch, wenn die Ergebnisse im Testblock direkt vor

expect(rock_superstars).to ... 

daher das Problem mit RSpec des zu tun zu haben scheint contain_exactly Ausdrucke gesehen. Bei einem Fehler wird actual collection contained: mit einer anderen Sortierreihenfolge als der, die die Abfrage generiert, ausgegeben.