2012-05-22 10 views
6

Próbuję odtworzyć logikę jako show here. Jednak nie mam szczęścia, gdy są sprzężenia. Poniżej jest zminimalizowana wersja mojego zapytania:N-per-group z JOIN

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

W skrócie, Dostaję listy, która zawiera identyfikatorów kategorii i chcę, aby ograniczyć wyniki do nie więcej niż n wyników z kategorii na przykład pokaż tylko dwa wyniki na catRef:

+0

'GDZIE catRef <= 2'? – eggyal

+0

Czy tytuł i catRef pochodzą z zasobów? –

+0

Zaktualizowałem wątek, aby był nieco bardziej szczegółowy, ponieważ przykładowy wynik, który podaję sugerował, że szukałem catRef = 2. Tytuł jest w zasobach, a catRef jest w catRel. –

Odpowiedz

2

Co powiesz na używanie podzapytania w swoim sprzężeniu. Nie byłem pewien, który należał stół refID i pozost do ale .....

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

nie przetestowałem tego - ale to jest to, co chciałbym spróbować, może z klauzulą ​​"sortuj według" w podzapytaniu – ErichBSchulz

0

W braku funkcji okna z MySQL, odpowiedź nie jest trywialne. Oto sztuczka, która wybiera najwyższy N rekord na grupę, wykorzystując MySQL's GROUP_CONCAT: MySQL: Selecting Top N Records Per Group.

Będąc funkcją agregującą, GROUP_CONCAT można manipulować w celu dostarczenia połączonych ciągów w żądanej kolejności. Za pomocą manipulacji tekstem łańcuch jest analizowany. Opcjonalnie wartości są rzutowane na odpowiednie typy.