2010-02-12 7 views
5

Me gusta, hay una palabra clave superior en el servidor sql 2005, cómo seleccionar la primera fila en mysql si tengo join en la tabla múltiple & quiero recuperar el extremo de cada ID/columna. Límite restringe el no. de vueltas de fila por lo que no puede resolver mi problema.MYSQL arriba N filas de la combinación de múltiples tablas

+0

¿Quizás un ejemplo? – hsz

+0

Sí, la pregunta no es muy clara. Acabo de adivinar –

+0

La pregunta no es muy clara, pero supongo que es otro caso del problema '' mayor-por-grupo' que aparece con frecuencia. –

Respuesta

3
SELECT v.* 
FROM document d 
OUTER APPLY 
     (
     SELECT TOP 1 * 
     FROM version v 
     WHERE v.document = d.id 
     ORDER BY 
       v.revision DESC 
     ) v 

o

SELECT v.* 
FROM document d 
LEFT JOIN 
     (
     SELECT *, ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY revision DESC) 
     FROM version 
     ) v 
ON  v.document = d.id 
     AND v.rn = 1 

Este último es más eficiente si sus documentos por lo general tienen pocas revisiones y hay que seleccionar todos o casi todos los documentos; el primero es más eficiente si los documentos tienen muchas revisiones o si necesita seleccionar solo un pequeño subconjunto de documentos.

Actualización:

Lo sentimos, no se dio cuenta que la pregunta es acerca MySQL.

En MySQL, lo haces de esta manera:

SELECT * 
FROM document d 
LEFT JOIN 
     version v 
ON  v.id = 
     (
     SELECT id 
     FROM version vi 
     WHERE vi.document = d.document 
     ORDER BY 
       vi.document DESC, vi.revision DESC, vi.id DESC 
     LIMIT 1 
     ) 

Crear un índice compuesto en version (document, revision, id) para que esto funcione rápido.

+0

MySQL no admite 'APLICAR' o' ROW_NUMBER() '(funciones de ventana). –

+0

@Bill: a la derecha, no se dio cuenta de que se trata de 'MySQL'. – Quassnoi

+0

La respuesta posterior funciona, pero ¿qué pasa si para algunas filas solo tengo un registro, por ejemplo, la versión tiene solo un registro para un determinado ID de documento, en ese caso la consulta no recupera las filas de ese ID. Perdón por la respuesta tardía/comentario –

0

Si te entiendo correctamente, la parte superior tampoco resuelve tu problema. arriba es exactamente equivalente al límite. Lo que está buscando son funciones agregadas, como max() o min() si desea los extremos. por ejemplo:

select link_id, max(column_a), min(column_b) from table_a a, table_b b 
where a.link_id = b.link_id group by link_id 
Cuestiones relacionadas