2009-12-17 10 views
5

Usando SQL (MySQL) solamente Quisiera seleccionar cada una de las últimas filas secundarias de una relación secundaria principal donde las filas secundarias están ordenadas por una marca de tiempo .¿Cómo selecciono la última fila secundaria de una relación padre/hijo usando SQL

Por ejemplo, usando las tablas de invoices y invoice_items, quiero que los más nuevos (es decir: más recientemente con sellos de tiempo) invoice_items registros para cada invoice respectivamente.

-------------------------- 
|Invoices    | 
-------------------------- 
|invoice_id| other fields| 
-------------------------- 
| 1  | ...   | 
-------------------------- 
| 2  | ...   | 
-------------------------- 
| 3  | ...   | 
-------------------------- 

-------------------------------------------- 
|Invoice_Items        | 
-------------------------------------------- 
| id | invoice_id | invoice_item_timestamp | 
-------------------------------------------- 
| 1 | 1   | 2009-12-01 10:00:00 | 
-------------------------------------------- 
| 2 | 1   | 2009-12-01 10:01:00 | 
-------------------------------------------- 
| 3 | 1   | 2009-12-01 10:02:00 | 
-------------------------------------------- 
| 4 | 2   | 2009-12-01 9:00:00 | 
-------------------------------------------- 
| 5 | 3   | 2009-12-02 08:30:00 | 
-------------------------------------------- 
| 6 | 3   | 2009-12-03 08:31:00 | 
--------------------------------------------  

¿Cuál es la mejor sintaxis de SQL para producir un conjunto de resultados que se parecería a la tabla siguiente?

----------------------------------------------------- 
|invoice_id| invoice_item_id |invoice_item_timestamp| 
--------------------------------------------------- 
| 1  | 3    | 2009-12-01 10:02:00 | 
| 2  | 4    | 2009-12-01 09:00:00 | 
| 3  | 6    | 2009-12-03 08:31:00 | 
----------------------------------------------------- 
+0

Qué servidor está usando? – Seth

+0

Estoy usando MYSQL. – rswolff

Respuesta

14
SELECT i.*,it.* 
FROM invoices i 
INNER JOIN (
SELECT invoice_id, MAX(invoice_item_timestamp) 
FROM invoice_items 
GROUP BY invoice_id 
) it ON (i.invoice_id=it.invoice_id) 
0

Me gustaría pensar que algo como esto funcionaría:

select i.invoice_id, ii.id, ii.invoice_item_timestamp from invoices i left join invoice_items ii on ii.invoice_id = i.invoice_id 
where ii.invoice_item_timestamp = 
    (select max(ii2.invoice_item_timestamp) from invoice_items ii2 where ii2.invoice_id = ii.invoice_id) 
1

yo no uso de MySQL, pero usted consigue la idea:

select 
    invoices in 

    inner join invoice_items it 
    on in.invoice_id = it.invoice_id 
    and invoice_item.invoice_item_id = 
    (select max(invoice_item_id) from invoice_item 
     where invoice_id = in.invoice_id) 

... suponiendo no hay duplicados de invoice_item_id y invoice_id en la tabla invoice_item.

-1

Usted podría intentar esto (no probado):

SELECT a.* 
FROM Invoices a, invoice_items b 
WHERE a.invoice_id = b.invoice_id 
ORDER BY invoice_item_timestamp DESC 
LIMIT 1 
+0

Esto no funciona. La cláusula LIMIT hace que el conjunto de registros devuelva solo un registro. En el ejemplo que proporcionó, devolvería el único registro con la PersonID más alta. Estoy buscando el último registro de niños de todos los padres, respectivamente. – rswolff

Cuestiones relacionadas