65 votes

mysql sélectionnez à partir des n dernières lignes

J'ai une table avec un index (incrémentation automatique) et de la valeur de type entier. La table est des millions de lignes de long.

Comment puis-je rechercher si un certain nombre d'apparaître dans les n dernières lignes de la table le plus efficacement?

91voto

Bill Karwin Points 204877

À partir de la réponse donnée par @chaos, mais avec quelques modifications:

  • Vous devriez toujours utiliser ORDER BY si vous utilisez LIMIT. Il n'y a pas d'ordre implicite de la garantie pour une table de SGBDR. Vous pouvez habituellement obtenir les lignes dans l'ordre de la clé primaire, mais vous ne pouvez pas compter sur cela, ni est-il portable.

  • Si vous commandez par dans l'ordre, vous n'avez pas besoin de connaître le nombre de lignes dans la table à l'avance.

  • Vous devez donner un nom de corrélation (aka alias de table) à une table dérivée.

Voici ma version de la requête:

SELECT `id`
FROM (
    SELECT `id`, `val`
    FROM `big_table`
    ORDER BY `id` DESC
    LIMIT $n
) AS t
WHERE t.`val` = $certain_number;

13voto

M Palani Mca Points 41

5 dernières lignes récupérer dans mysql

Cette requête fonctionne parfaitement

SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC

ou

select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc

12voto

Dana the Sane Points 7976

Profitez de TRI et de LIMITER les comme vous le feriez avec la pagination. Si vous voulez le i-ème bloc de lignes, l'utilisation de l'OFFSET.

SELECT val FROM big_table
where val = someval
ORDER BY id DESC
LIMIT n;

En réponse à Nir: L'opération de tri n'est pas nécessairement pénalisé, cela dépend de ce que le planificateur de requête. Depuis ce cas d'utilisation est cruciale pour la pagination de la performance, il y a quelques optimisations (voir le lien ci-dessus). Cela est vrai dans postgres "ORDRE PAR ... la LIMITE peut être fait sans tri" E. 7.1. Dernière puce

explain extended select id from items where val = 48 order by id desc limit 10;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | items | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+

3voto

Michael Buen Points 20453

parce qu'il est en autoincrement, voici mon point de vue:

Select * from tbl 
where certainconditionshere 
and autoincfield >= (select max(autoincfield) from tbl) - $n

0voto

Luke Madhanga Points 353

Je sais que cela peut être un peu vieux, mais essayez d'utiliser PDO::lastInsertId. Je pense que c'est ce que vous voulez, mais vous pouvez réécrire votre application pour utiliser PDO (Qui est beaucoup plus sûr contre les attaques)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X