2012-05-22 15 views
6

Estoy tratando de replicar la lógica como se muestra here. Sin embargo, no estoy teniendo suerte cuando hay uniones. A continuación se muestra una versión minimizada de mi consulta:N-per-group con JOIN

SELECT resources.title, catRel.catRef 
FROM resources 
LEFT JOIN placesRel ON placesRel.refId = resId 
LEFT JOIN catRel ON refId = resId 
WHERE ... 

En resumen, estoy recibiendo una lista, que contiene la categoría Ids y quiero limitar los resultados a tener más de n resultados de una categoría, por ejemplo, mostrar solo dos resultados por catRef:

title    catRef 
Swizz Gubbinz  1 
Runcible Spoons 1 
Peter Pan DVD  2 
Button Moon  2 
Monkey Alan  3 
Bilge Pump  3 
+0

'WHERE catRef <= 2'? – eggyal

+0

¿Son el título y el catRef ambos de los recursos? –

+0

He actualizado el hilo para ser un poco más específico, ya que el ejemplo de salida que doy sugirió que estaba buscando catRef = 2. el título está en recursos y catRef está en catRel. –

Respuesta

2

¿Qué le parece usar una subconsulta dentro de su unión? No estaba seguro de qué tabla refID y resNum pertenecían a ..... pero

SELECT resources.title, catRel.catRef 
FROM resources 
LEFT JOIN placesRel ON placesRel.refId = resId 
LEFT JOIN catRel as cr1 ON cr1.catRel.primaryKey in (select cr2.primaryKey from catRel as cr2 where cr2.refID = resId Limit 0,2) 
WHERE ... 
+1

no he probado esto, pero es lo que probaría, tal vez con una cláusula de "orden por" en la subconsulta – ErichBSchulz

0

En la falta de funciones de la ventana de MySQL, la respuesta no es trivial. Este es un truco que selecciona el registro N superior por grupo, mediante el uso de GROUP_CONCAT de MySQL: MySQL: Selecting Top N Records Per Group.

Al ser una función de agregado, GROUP_CONCAT se puede manipular para proporcionar cadenas concatenadas en el orden deseado. Usando la manipulación de texto, la cadena es analizada. Opcionalmente, los valores se convierten a los tipos adecuados.