2010-06-17 9 views
2

J'ai récemment posté une question sur l'obtention des 3 derniers résultats dans le tableau dans l'ordre correct. Je veux maintenant obtenir tous les commentaires à part les 3 derniers dans le bon ordre.mysql - problème de décalage

Voici ma syntaxe;

SELECT * 
FROM (SELECT * 
     FROM $table 
     ORDER BY ID DESC 
     OFFSET 3) AS T 
ORDER BY TIME_STAMP 

L'erreur que je reçois est:

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de « OFFSET, 3) T ORDER BY TIME_STAMP » à la ligne 1

Je ne peux pas sembler le faire fonctionner. Toute aide très appréciée.

Répondre

8

Selon le MySQL Documentation:

Pour récupérer tous les lignes d'un certain décalage jusqu'à la fin du résultat ensemble, vous pouvez utiliser un grand nombre pour le deuxième paramètre. Cette déclaration récupère toutes les lignes de la ligne 96ème à la dernière:

Ils vous recommandons d'utiliser une requête telle que:

SELECT * FROM tbl LIMIT 95,18446744073709551615; 

Donc, dans votre cas, vous devriez essayer:

SELECT * 
FROM (SELECT * 
     FROM $table 
     ORDER BY ID DESC 
     LIMIT 3,18446744073709551615) AS T 
ORDER BY TIME_STAMP 

Notez que vous pouvez également utiliser la version compatible PostgreSQL en utilisant le mot-clé OFFSET:

SELECT * 
FROM (SELECT * 
     FROM $table 
     ORDER BY ID DESC 
     LIMIT 18446744073709551615 OFFSET 3) AS T 
ORDER BY TIME_STAMP 

Juste au cas où vous vous le demandez, 18446744073709551615 = 2^64 - 1.

+0

Je pense que le PO cherche le contraire. Obtenir tous les enregistrements, sauf pour le dernier 3. –

+0

@Daniel: C'est ce que cette déclaration fait. Il saute les 3 premiers et retourne le reste. – Senseful

+0

qui est sur et bien expliqué, merci! –

4

Vous ne pouvez pas utiliser OFFSET sans LIMIT.

Un peu encombrant, mais cette requête a fonctionné pour moi, et non travaillé sans sous-requête interne redondante (MySQL 5.0.90)

select * from $table 
where id not in (
    select id from (
    select id from languages order by id DESC LIMIT 3 
) l1 
) order by time_stamp