2011-05-06 5 views
20

Ésta es mi estructura de la tablaSeleccione el pasado 20 de orden por el ascendente - PHP/MySQL

MyTable 
ID[P.K][auto increment] TopicID UID Comment 

ahora quiero conseguir el pasado 20 de comentario a una TopicID pero debería ser ordenados en orden ascendente!

[Al igual que Facebook muestra por defecto el pasado 20 de comentario solamente]

Busco a una versión optimizada, puedo hacer esto con 2/3 consulta y matriz PHP tipo, pero en busca de alguna alternativa mejor

Sample Result with data

MyTable 
ID TopicID UID Comment 
1 1  10 AAAA 
2 1  11 BBBB 
3 1  10 CCCC 
4 1  10 dddd 
5 1  11 EEEE 
6 1  10 FFFF 

Quiero conseguir el último 3 resultado para un TopicID, el resultado debería ser

4 1  10 dddd 
5 1  11 EEEE 
6 1  10 FFFF 

y no

6 1  10 FFFF 
5 1  11 EEEE 
4 1  10 dddd 
+0

¿En qué campo estás tratando de ordenar? –

+0

Quiero ordenar el resultado por ID ascendente – Sourav

Respuesta

31

Primero, seleccione las últimas 20 entradas. Luego, ordénelos en orden ascendente. Usted puede hacer esto en una sola consulta (con subconsulta):

select * from (
    select * from your_table order by id desc limit 20 
) tmp order by tmp.id asc 
+0

exactamente lo que estaba buscando, gracias – Sourav

+0

Me alegra ayudar;) – binaryLV

+0

El uso de una subconsulta aquí no es necesario. Las subconsultas son caras y casi nunca necesarias. Puede lograr los mismos resultados ejecutando solo la sub consulta y luego imprimiéndolas en orden inverso en el lado de PHP. – eykanal

0

yo no entiendo muy bien ??

¿Qué ocurre con un simple SELECT * FROM MyTable WHERE TopicID = 1 ORDER BY ID ASC LIMIT 20?

Por cierto, si está mostrando los últimos ingresados ​​(es decir, los más recientes), querrá DESC (descendente), no ASC. Además, usar la identificación es muy poco confiable, debe tener una columna DATETIME que se almacena cuando se ingresó el comentario.

EDITAR: binaryLV's answer hará esto correctamente utilizando una subconsulta. Es la misma consulta que la mía, DESC 'd, y luego recurrió por ID.

+0

Necesita las últimas 20 entradas, ordenadas en asc.Como "5, 6, 7" (en lugar de "7, 6, 5") de "1, 2, 3, 4, 5, 6, 7". – binaryLV

+0

Aahhhh, ¡votó tu respuesta! :-) –

-1

Suponiendo que la identificación es AUTO_INCREMENT, lo que permitiría que lo use como un campo de pseudo-fecha,

SELECT * FROM MyTable 
    ORDER BY ID DESC 
    LIMIT 20 
+0

Me gusta la idea de ordenar por 'id' (eso es lo que suelo hacer). Sin embargo, el resultado de esta consulta no se ordenará según lo necesite el autor. – binaryLV

0

Es necesario añadir una columna CommentDate y cada vez que se inserta un comentario uso NOW() o GETDATE() utilizan entonces seleccione:

SELECT Comment FROM MyTable WHERE [email protected] ORDER BY CommentDate DESC, TopicID ASC LIMIT 20 
+0

'TOP (20)'? En MySQL? – binaryLV

+0

@binaryLV Tienes razón. Límite 20 – Danpe

+0

Sí, pero él no necesita * primeras * entradas. – binaryLV

3
SELECT * 
FROM (
     SELECT * 
     FROM mytable 
     WHERE topicid = $mytopicid 
     ORDER BY 
       id DESC 
     LIMIT 20 
     ) q 
ORDER BY 
     id 

o, de manera más eficiente,

(
SELECT * 
FROM mytable 
WHERE topicid = $mytopicid 
ORDER BY 
     id DESC 
LIMIT 20 
) 
ORDER BY 
     id 
1
SELECT * FROM 
    (SELECT * FROM MyTable 
    ORDER BY ID DESC 
    LIMIT 20) ilv 
ORDER BY ID; 
-1

Puede probar este

SELECT * FROM(
    SELECT TOP 20 * FROM TableName 
    ORDER BY Id DESC 
) 
Naushad ORDER BY Naushad.Id 
+0

La pregunta está etiquetada como MySQL, su script funcionaría para SQL-Server. – bummi

1

Esta debería ser la expresión más corta para hacer el trabajo:

(select * from your_table order by id desc limit 20) order by id; 
Cuestiones relacionadas