2010-01-18 6 views
5

estoy ejecutando una consulta sencilla con una unión, similar aconsulta SQL con el límite de filas de una tabla, no el conjunto de resultados

SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON ... LIMIT 5 

Como t1 tiene muchas filas en-t2 (cualquier número por encima del 2) la instrucción LIMIT no devuelve las primeras 5 filas de t1 y las entradas correspondientes de t2, sino 5 filas que generalmente incluyen 2-3 filas de t1.

¿Cómo puedo escribir esta consulta para obtener las primeras 5 filas de t1 y las entradas correspondientes de t2?


Usando MySQL 5.0.45.

Respuesta

7
SELECT t3.a, t2.b FROM (SELECT * FROM t1 LIMIT 5) t3 
LEFT JOIN t2 ON ... 

Tenga en cuenta que si se utiliza sin límite de un «orden por cláusula, no se define cuales 5 filas obtendrá. Considere agregar una cláusula 'ordenar por' si esto no es lo que quiere.

+0

Tenga en cuenta que esta solución tiene problemas de escalabilidad con MySQL, además de no funcionar si desea PEDIR POR un campo en t2. – hobodave

+0

@hobodave Afortunadamente, I 'ORDER BY' un campo en t1. –

+0

@Robert: Puede encontrar que necesita aplicar el ORDER BY dos veces: una vez dentro de la consulta interna para seleccionar las primeras cinco filas y luego otra vez en la consulta externa para garantizar que los resultados se devuelvan en el mismo orden. –

0

creo que el siguiente va a hacer el truco:

SELECT t1.a, (SELECT t2.b FROM t2 WHERE t2... = t1...) AS b FROM t1 LIMIT 5 
+0

Gracias por la respuesta. Como hay múltiples entradas en t2 correspondientes a t1, obtengo 'ERROR 1242 (21000): Subquery devuelve más de 1 fila'. –

2

Esta es una consulta de paginación clásica. Sugiero lo descomponen en dos consultas:

SELECT DISTINCT t1.id FROM t1 LEFT JOIN t2 ON ... LIMIT 5 

Tome estos identificadores y colocarlos en la siguiente consulta:

SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON ... WHERE t1.id IN (?,?,?,?,?) 
+0

Gracias por la respuesta. Una solución de 1 consulta es preferible, y se ha proporcionado. –

+0

np, solo tenga en cuenta las implicaciones de rendimiento de la solución de tabla derivada, así como de SELECT *. – hobodave

+0

Ese es un buen punto también. En este momento, la tabla derivada necesita mirar ~ 8k filas, y es lo suficientemente rápido. Además, no usaré 'SELECT *'. –

0

Puede agrupar por la columna única en t1:

SELECT * FROM t1 JOIN t2 ON ... GROUP BY t1.id LIMIT 5 

¿Pero necesita que la tabla t2 esté en un orden específico?

+0

Gracias por la respuesta. Por favor, mira mi pregunta, necesito más de 5 filas devueltas, son más de 10 filas de t2 junto con _exactly_ 5 filas de t1. La respuesta aceptada tiene una buena solución. El de Hobodave también funciona. –

+0

ah sí, tiene sentido, no leyó la pregunta correctamente. La respuesta aceptada funciona bien. También podría hacerlo con variables que cuenten las filas únicas, pero eso se complica. – TimoSolo

Cuestiones relacionadas