La estructura es:
CREATE TABLE current ( id BIGINT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), symbol VARCHAR(5), UNIQUE (id), INDEX (symbol) ) ENGINE MyISAM;| identificación | símbolo |
|---|---|
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | C |
| 5 | B |
| 6 | A |
| 7 | C |
| 8 | C |
| 9 | A |
| 10 | B |
estoy usando lo siguiente
SELECT * FROM current WHERE id IN ( SELECT MAX(id) FROM current GROUP BY symbol )para devolver los últimos registros de una tabla.
| identificación | símbolo |
|---|---|
| 8 | C |
| 9 | A |
| 10 | B |
¿Cómo puedo devolver los penúltimos resultados de manera similar?
se que necesito
ORDER BY id DESC LIMIT 1,1en algún lugar, pero mi foo es débil.
yo quisiera volver
| identificación | símbolo |
|---|---|
| 5 | B |
| 6 | A |
| 7 | C |
SELECT * FROM current WHERE id IN ( SELECT DISTINCT T.id FROM current AS T WHERE id=( SELECT id FROM current WHERE symbol=T.symbol ORDER BY id DESC LIMIT 1,1 ) )Fácil si su MySql puede usar ROW_NUMBER. (MySql 8)
Solo hazlo descender, luego toma el segundo.
WITH CTE AS ( SELECT * , ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY id DESC) AS symbol_rn FROM current ) SELECT id, symbol FROM CTE WHERE symbol_rn = 2 ORDER BY id; En MySql 7.5 puede simplemente unirse en el símbolo y agrupar por.
Luego, el penúltimo tendrá 1 ID más alto.
SELECT c1.id, c1.symbol FROM current c1 LEFT JOIN current c2 ON c2.symbol = c1.symbol AND c2.id >= c1.id GROUP BY c1.id, c1.symbol HAVING COUNT(c2.id) = 2 ORDER BY c1.id; | identificación | símbolo |
|---|---|
| 5 | B |
| 6 | A |
| 7 | C |
db<>violín aquí
El rendimiento realmente se beneficiará de un índice en el símbolo.
Para versiones de MySql anteriores a la 8.0, use una subconsulta en la cláusula WHERE para filtrar la id máxima de cada símbolo y luego agregue:
SELECT MAX(id) id, symbol FROM current WHERE id NOT IN (SELECT MAX(id) FROM current GROUP BY symbol) GROUP BY symbol ORDER BY id; Ver la demostración .
Puedes probar esto;
SELECT * FROM current WHERE id IN (SELECT MAX(id) FROM current GROUP BY symbol) ORDER BY id DESC LIMIT 1,3límite 1,3 dice; obtener los últimos 3 resultados excluyendo el último resultado. Puedes cambiar los números.