2009-01-30 22 views
21

Estoy tratando de limitar la siguiente declaración de SQL.LIMITAR un JOIN de SQL

SELECT expense.*, transaction.* FROM expense 
INNER JOIN transaction ON expense_id = transaction_expense_id 

Lo que yo quiero hacer, es limitar el número de filas 'padre'. ES DECIR. si hago un LÍMITE 1, recibiría solo un artículo de gasto, pero aún obtendría todas las transacciones asociadas con él.

¿Cómo se lograría esto?

En esta etapa, si hago LIMIT 1, obtengo un gasto y solo una transacción.

+0

que podría estar siendo mudo, pero no necesita incluir la tabla de usuario en el algún lugar de unirse a? – Ben

+0

como señaló @rixth, debe calificar sus combinaciones en todas las tablas involucradas en SELECT ... –

+0

¡Vaya, olvidó que la tabla de usuarios estaba allí! Error de mi parte, la búsqueda ha sido arreglada. –

Respuesta

11

Así que asumiendo que podemos excluir la tabla de usuario, que podría ser reescrita como:

select * from expense, transaction where expense_id = transaction_expense_id 

Ahora bien, si desea aplicar un límite, podría hacerlo de esta manera:

select * from expense, transaction where expense_id = transaction_expense_id and 
    expense_id in (select expense_id from expense limit 1) 

Would que haces lo que querías? Obviamente, debes ser cauteloso sobre el orden en el que volverán tus expenses_ids, por lo que probablemente quieras usar ORDER BY lo que sea.

Editar: Dada la limitación de MySQL se describe en su comentario a continuación, tal vez esto funcionará:

select * from (select id from expense order by WHATEVER limit 1) as t1, transaction where expense_id=transaction_expense_id; 

Ben

+0

"# 1235 - Esta versión de MySQL aún no admite 'LIMIT & IN/ALL/ANY/ALGUNA subconsulta'" Versión del servidor: 5.0.27-community-nt –

+1

La subconsulta es la forma correcta de hacer esto. Has alcanzado una limitación de MySQL; cualquiera de las actualizaciones (a 5.1, que podría arreglar esto, o a Postgres). De lo contrario, tendrá que considerar una solución SQL no pura o algo realmente horrible. – kquinn

+0

Marcado como respuesta aceptada porque funcionaría en otro entorno SQL. –

8

Vas a tener que especificar qué gasto elemento que desea obtener. ¿El más caro? ¿El más nuevo? Luego unirse contra una subconsulta que devuelve sólo eso:

SELECT 
    expense.*, transaction.*, user.* 
FROM 
    (SELECT * FROM expense WHERE ...) AS expense 
INNER JOIN 
    transaction ON expense_id = transaction_expense_id 
+1

¿Qué pasa si quiero decir, devolver 10 artículos de gastos (con transacciones asociadas) –

+0

@rixth: utiliza tantos elementos de gasto como devolverá la subconsulta. –

+0

@Tom Cambie a 'DONDE ... LÍMITE 10) COMO gasto'. Creo. – Timmmm

2

Desde la actualización del servidor SQL no es una opción, que puede terminar haciendo dos consultas.

expenses = SELECT * FROM expense ... LIMIT x 
foreach expenses as expense 
    expense.transactions = SELECT * FROM transacion WHERE transaction_expense_id = expense.expense_id