Wie BY

2017-04-07 2 views
-1

ich einen Fehler Also, ASC und RANDOM() auf SQLite mischen, um mit Blick auf bei dem Versuch, für 2 Spalten ORDER BY zu verwenden:Wie BY

... ORDER BY val, random();

Fehler ist: „2. ORDER BY Begriff passt nicht jede Spalte in der Ergebnismenge“

Ich habe versucht, verschiedene Arten ASC kombinieren für erste Spalte und zufällige Sortierung für die zweite Spalte sortiert wird, ohne Glück.

aktualisiert, um mehr Informationen zur Verfügung zu stellen

CREATE TABLE tabela ( id INTEGER, val TEXT, PRIMARY KEY (id) );

INSERT INTO tabela (val) VALUES ('paid'); 
INSERT INTO tabela (val) VALUES ('paid'); 
INSERT INTO tabela (val) VALUES ('paid'); 
INSERT INTO tabela (val) VALUES ('standard'); 
INSERT INTO tabela (val) VALUES ('standard'); 
INSERT INTO tabela (val) VALUES ('standard'); 
INSERT INTO tabela (val) VALUES ('standard'); 
INSERT INTO tabela (val) VALUES ('standard'); 

Erwartetes Probener:

val  id 
---  --- 
paid  3 
paid  1 
paid  2 
standard 5 
standard 8 
standard 4 
standard 6 
standard 7 

wo 'id' 1,2,3 wird innerhalb von 'bezahlt' 'val zufällig sortiert werden' und 'id' 4 ... 8 zufällig sein innerhalb 'Standard' 'val' sortiert

+0

'Auftrag von a, b 'bedeutet nicht, zu sortiere eine Spalte nach a und eine Spalte nach b. Sie werden immer komplette Zeilen sortieren. Der erste Sortierschlüssel ist a, für das gleiche a wird der zweite Schlüssel b ausgewertet. Bitte geben Sie ein MCVE http://stackoverflow.com/help/mcve Für SQLite ein, das einen Dump enthält, dh einen Text mit mindestens einem "CREATE TABLE" und mehreren "INSERT INTO" -Zeilen, damit wir Ihre Beispielstruktur neu erstellen können Beispieleingabe. Geben Sie ein Codebeispiel an, bei dem zwei Spalten nach anderen Schlüsseln als "random()" sortiert werden (d. H., Dass Sie mich falsch angeben). – Yunnosch

+0

Hallo @Yunnosch, danke für deine Aufmerksamkeit. Es tut mir leid, dass ich nicht "Complete" bin. Ich habe eine Frageupdate gepostet, hoffe mein MCV ist jetzt in Ordnung. –

+0

Sind "bezahlte" und "standardmäßige" feste Strings? Kann ich sie in der Abfrage fest codieren? – Yunnosch

Antwort

1

select val, id from (select random() as r, * from tabela) order by val, r;

der Trick ist eine on-the-fly-Tabelle (in den (...)) zu machen, die eine Spalte mit Zufallswerten haben. Es ist möglich, dadurch zu bestellen.
Beachten Sie, dass diese Abfrage vollständige Zeilen dieser Tabelle "on-the-fly" sortiert/sortiert.

Ausgang 1:

paid|1 
paid|3 
paid|2 
standard|8 
standard|5 
standard|7 
standard|6 
standard|4 

Ausgang 2:

paid|3 
paid|1 
paid|2 
standard|5 
standard|8 
standard|7 
standard|4 
standard|6 

Bitte entschuldigen Sie meinen Eindruck, dass Sie von der Bestellung Spalten denken. Es kann Ihnen helfen, den Unterschied zu sehen, wenn Sie nur die Unterabfrage in (...) verwenden, die Ausgabe untersuchen und sich dann vorstellen, die Zeilen manuell "zu sortieren", während Sie keine der Zeilen ändern dürfen.

Dies ist die Abfrage, die die on-the-fly-Tabelle (mit zusätzlichem Bestell) machen:

select random() as r, * from tabela order by val, id; 

und seine Ausgabe:

6112298175921944810|1|paid 
-750320757383183987|2|paid 
-4687754812847362857|3|paid 
574487853771424670|4|standard 
6662074554381494613|5|standard 
5947282373212186891|6|standard 
-695595223160523440|7|standard 
-6914056362765123037|8|standard 
+0

Ja @ Yunnosch, löste es die Frage, danke. Ich habe auch versucht, "wählen Sie ID, val aus Tabela, wo Val = 'bezahlte' Auftrag per Zufall() Union alle wählen Sie ID, val aus Tabela, wo val = 'Standard' Auftrag durch Zufall();" , die den gleichen Fehlertyp wie die erste ansteigt. –