2010-07-20 4 views
1

Je cherche à saisir la première ligne (ordonnée par date décroissant) à partir d'une table, puis récupérer le reste des lignes (trié par last_name croissant). Je suppose que j'ai besoin d'utiliser une déclaration UNION pour cela, mais j'ai du mal à le faire fonctionner.2 Requêtes SQL à partir de la même table

Merci d'avance

+0

Est-ce que 'date' est en soi garanti unique? – Wrikken

+0

Quelle est la structure de votre table? Avez-vous un PK? –

+0

La date n'est pas unique car il s'agit d'un horodatage importé à partir d'un format de date. Et oui j'ai un PK appelé 'id'. – Dylan

Répondre

2
SELECT * 
FROM yourtable 
ORDER BY 
    id = (SELECT id FROM yourtable ORDER BY date DESC LIMIT 1) DESC, 
    last_name 
+1

J'aime l'astuce "trier par indicateur booléen calculé". –

+0

Il semble avoir travaillé. Merci de votre aide! – Dylan

2

Pourquoi ne pas exécuter deux requêtes? Cela semble être une réponse évidente.

Toutes les tâches ne doivent pas être effectuées dans une seule requête. Est-ce que vous écrivez tout votre code PHP dans une déclaration? ;-)

+0

Je sais qu'il serait plus logique de le faire séparément (et je le ferais normalement), mais sans trop entrer dans les détails, ce serait beaucoup plus facile s'il y avait un moyen de le faire en 1 requête. – Dylan

2

En supposant en utilisant MySQL, vous pouvez utiliser:

(SELECT t.* 
    FROM TABLE t 
ORDER BY t.date DESC 
    LIMIT 1) 
UNION 
(SELECT t.* 
    FROM TABLE t 
ORDER BY t.last_name) 

Vous devez résumer les déclarations entre parenthèses pour appliquer la clause ORDER BY - sinon, ORDER BY est appliquée à l'après resultset l'UNION.

+0

Cela inclura cette première rangée deux fois, une fois en haut et encore en bas, ce que l'affiche ne veut probablement pas. –

+1

@ Scott Stafford: Non, ce ne sera pas parce que UNION supprime les doublons. Vous auriez raison si c'était UNION ALL –

+0

Intéressant ... Apprenez quelque chose tous les jours. Merci. –

Questions connexes