2017-09-26 1 views
1

Im Moment habe ich ein Formular, das eine Abfrage abfragt, um sie zu sortieren. Ich weiß, dass es möglich ist, nach mehr als einem Kriterium zu sortieren, aber wenn ich versuche, der Abfrage die Kriterien zweiter Ordnung hinzuzufügen, scheint es nichts zu tun.Derzeit verwenden Sie eine Abfrage, um eine andere Abfrage zu bestellen. Können diese kombiniert werden?

Dies ist die Random LP Picker Abfrage. Es gibt mir eine zufällige Auswahl von 10 LPs aus einer Liste von Hunderten:

SELECT TOP 10 Artists.OriginalName, LPs.Album, LPs.rating, LPs.[Notable 
Songs], LPs.Comments, [Listened (LPs)].last_date, [Listened 
(LPs)].times_listened, LPs.LPID 
FROM (LPs INNER JOIN Artists ON LPs.Performer_id = Artists.ArtistID) INNER 
JOIN [Listened (LPs)] ON LPs.LPID = [Listened (LPs)].disc_id 
WHERE (((LPs.Status)=1 Or (LPs.Status)=5) AND ((LPs.[Media Type])=1)) 
ORDER BY Rnd(Int(Now()*[LPID])-Now()*[LPID]); 

In meiner Form bestelle ich die Abfrage nach dem Datum wie folgt aus:

SELECT [Random LP Picker].* 
FROM [Random LP Picker] 
ORDER BY [Random LP Picker].last_date; 

Ich habe versucht, beide Sorten in zufälliger Reihenfolge LP setzen Picker Abfrage, so sieht es so aus:

ORDER BY Rnd(Int(Now()*[LPID])-Now()*[LPID]), [Listened (LPs)].last_date; 

Doing, dass gibt mir nicht die Liste sortiert nach last_date. Ich habe auch versucht, diese zwei Sortierelemente umzukehren, aber das führt dazu, dass einige Felder aus Gründen, die mein begrenztes Wissen übersteigen, gar nicht erscheinen.

Es wäre nützlich, wenn ich das alles in einer einzigen Abfrage tun könnte. Ist es möglich?

HINWEIS: Ein paar Leute gesagt haben, warum nicht nur nach Datum geordnet. Die Sache ist, was diese Abfrage macht, ist das zufällige Ordnen aller Einträge und dann das Zurückgeben der ersten 10. Wenn ich also die Reihenfolge durch den Rnd (...) Teil entferne, bekomme ich keine 10 zufälligen Einträge mehr. Wenn es eine andere Möglichkeit gibt, 10 zufällige Einträge zu erhalten, ohne ORDER zu verwenden, würde ich das gerne tun, aber dies ist die einzige Möglichkeit, die ich kenne.

+0

Ich bin nicht sicher ms Zugriff aber im allgemeinen SQL Befehle in der Reihenfolge der Prädikate wie definiert das heißt von links nach rechts. auch in anderen rdbms Angines können Sie ASC oder DESC, z. ORDER BY DATE1 ASC, DATUM2 DESC. –

+0

Alles, was Sie wollen, damit das Endergebnis nach 'last_date' sortiert wird, also warum nicht nur ORDER BY nur auf' [Listened (LPs)]. Last_date' in Ihrer Anfrage? – MKR

+0

Wenn ich nur nach last_date bestelle, wie bekomme ich dann 10 zufällige Einträge? Gibt es einen anderen Weg als das, was ich tue? –

Antwort

0

Da Sie möchten, dass Ihr Endergebnis unter last_date sortiert wird, sollte Ihre letzte ORDER BY auf [Listened (LPs)].last_date lauten. Eine Unterabfrage sollte TOP 10 Zeilen basierend auf Zufallszahlen zurückgeben.

können Sie versuchen Linie ORDER BY Rnd(Int(Now()*[LPID])-Now()*[LPID]), [Listened (LPs)].last_date;

mit

[Listened (LPs)].last_date;

ersetzt Die modifizierte Abfrage aussehen wird:

SELECT Artists.OriginalName, LPs.Album, LPs.rating, LPs.[Notable 
    Songs], LPs.Comments, [Listened (LPs)].last_date, [Listened 
    (LPs)].times_listened, LPs.LPID 
    FROM (LPs INNER JOIN Artists ON LPs.Performer_id = Artists.ArtistID) INNER 
    JOIN [Listened (LPs)] ON LPs.LPID = [Listened (LPs)].disc_id 
    WHERE (((LPs.Status)=1 Or (LPs.Status)=5) AND ((LPs.[Media Type])=1)) 
    AND LPs.LPID IN (SELECT TOP 10 LPID FROM LPs ORDER BY Rnd(Int(Now()*[LPID])-Now()*[LPID])) 
ORDER BY [Listened (LPs)].last_date; 
+0

Aber dann bekomme ich keine 10 zufälligen Einträge mehr; Das brauche ich immer noch. –

+0

@CharlesHerold Wahr. Ich habe andere Teile der Abfrage nicht geändert. Ich habe es mit weiteren Details bearbeitet. – MKR

1

Betrachten Abfrage in eine abgeleitete Tabelle zu bewegen (dh Unterabfrage in FROM) und nach äußeren Abfrage sortieren:

SELECT main.* 
FROM 
    (SELECT TOP 10 a.OriginalName, l.Album, l.rating, l.[Notable Songs], 
      l.Comments, p.last_date, p.times_listened, l.LPID 
    FROM (LPs l INNER JOIN Artists a ON l.Performer_id = a.ArtistID) 
    INNER JOIN [Listened (LPs)] p ON l.LPID = p.disc_id 
    WHERE ((l.Status IN (1,5)) AND (l.[Media Type]=1)) 
    ORDER BY Rnd(Int(Now()*l.[LPID])-Now()*l.[LPID]) 
) As main 
ORDER BY main.last_date 
Verwandte Themen