leí la siguiente solución de hace mucho tiempo, pero no puedo encontrar el enlace al crédito, pero aquí va:
SELECT users.*, payments.method, payments.id AS payment_id, payments2.id
FROM users
JOIN payments
ON users.id = payments.user_id
LEFT JOIN payments2
ON payments.user_id = payments2.user_id
AND payments.id < payments2.id
WHERE payments2.id IS NULL
Para entender cómo funciona esto, simplemente dejar caer el WHERE payments2.id IS NULL
y se le ver lo que está sucediendo, por ejemplo, podría producir la siguiente salida (no he construido el esquema para probar esto, por lo que es pseudo-salida).Supongamos que hay los siguientes registros en payments
:
id | user_id | method
1 | 1 | VISA
2 | 1 | VISA
3 | 1 | VISA
4 | 1 | VISA
Y el SQL anterior (sin la cláusula WHERE payments2.id IS NULL
) debe producir:
users.id | payments.method | payments.id | payments2.id
1 | VISA | 1 | 2
1 | VISA | 1 | 3
1 | VISA | 1 | 4
1 | VISA | 2 | 3
1 | VISA | 2 | 4
1 | VISA | 3 | 4
1 | VISA | 4 | NULL
Como se puede ver el la última línea produce el resultado deseado, y ya que no hay payments2.id > 4
, la combinación IZQUIERDA da como resultado un payments2.id = NULL
.
He encontrado esta solución mucho más rápida (de mis primeras pruebas) que la respuesta aceptada.
Uso de un esquema diferente, pero una consulta similar, de 16095 registros:
select as1.*, as2.id
from allocation_status as1
left join allocation_status as2
on as1.allocation_id = as2.allocation_id
and as1.id < as2.id
where as2.id is null;
16095 rows affected, taking 4.1ms
En comparación con la respuesta aceptada de MAX/subconsulta:
SELECT as1.*
FROM allocation_status as1
JOIN (
SELECT max(id) as id
FROM allocation_status
group by allocation_id
) as_max on as1.id = as_max.id
16095 rows affected, taking 14.8ms
posible duplicado de [puedo utilizar función de agregación (LAST) en mysql ??] (http://stackoverflow.com/questions/5495913/can-i-use-aggregation-function-last-in-mysql) –
Consulte la respuesta en el enlace anterior para obtener el último registro del grupo –
Incluso utilizando MAX (payments.id) esto no selecciona los valores correspondientes, es decir, método de pago. Si ejecuto la consulta con MAX (payments.id) selecciona la identificación de pago más reciente pero el primer método de pago. – Ryan