Tengo una users
tabla y una payments
tabla, para cada usuario, aquellos de los cuales tienen pagos, pueden tener múltiples pagos asociados en la payments
tabla. Me gustaría seleccionar a todos los usuarios que tienen pagos, pero solo selecciono su último pago. Estoy probando este SQL, pero nunca antes había probado declaraciones SQL anidadas, así que quiero saber qué estoy haciendo mal. Agradezco la ayuda
SELECT u.*
FROM users AS u
INNER JOIN (
SELECT p.*
FROM payments AS p
ORDER BY date DESC
LIMIT 1
)
ON p.user_id = u.id
WHERE u.package = 1
mysql
sql
select
inner-join
Wasim
fuente
fuente
Part 1 - Joins and Unions
. :) marcado!Esta solución es mejor que la respuesta aceptada porque funciona correctamente cuando hay algunos pagos con el mismo usuario y fecha.
fuente
Mira este sqlfiddle
fuente
limit 1
cláusula solo devolverá 1 usuario, que no es lo que quiere el OP.date
columna es diferente demax(p.date)
. Si agrega más columnas en lapayments
tabla (por ejemplocost
), todas las columnas no serán de la fila necesariafuente
Hay dos problemas con su consulta:
INNER JOIN (SELECT ...) AS p ON ...
.Suponiendo que no haya vínculos para
payments.date
, intente:fuente
From payments as p Where p.user_id =@user_id
cuando la consulta está haciendo un grupo en toda la tabla.La respuesta de @John Woo me ayudó a resolver un problema similar. También he mejorado su respuesta estableciendo el orden correcto. Esto me ha funcionado:
Sin embargo, no estoy seguro de cuán eficiente sea esto.
fuente
Esto lo hará funcionar
fuente
Matei Mihai dio una solución simple y eficiente, pero no funcionará hasta que coloque una parte
MAX(date)
en SELECT, por lo que esta consulta se convertirá en:Y ordenar por no hará ninguna diferencia en la agrupación, pero puede ordenar el resultado final proporcionado por grupo. Lo probé y funcionó para mí.
fuente
Mi respuesta se inspiró directamente en @valex muy útil, si necesita varias columnas en la cláusula ORDER BY.
fuente
Puedes probar esto:
fuente