N на группу с JOIN

Я пытаюсь повторить логику, как показано здесь. Однако мне не везет, когда есть соединения. Ниже приведена минимизированная версия моего запроса:

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

Короче говоря, я получаю список, который содержит идентификаторы категорий, и я хочу ограничить результаты, чтобы иметь не более n результатов из категории, например, показывать только два результата на catRef:

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

person Kohjah Breese    schedule 22.05.2012    source источник
comment
Являются ли title и catRef обоими из ресурсов?   -  person Marcus Adams    schedule 23.05.2012
comment
Я обновил ветку, чтобы сделать ее немного более конкретной, так как приведенный мной пример вывода предполагает, что я искал catRef = 2. title находится в ресурсах, а catRef находится в catRel.   -  person Kohjah Breese    schedule 23.05.2012
comment
Вы используете mysql. Это легко сделать с помощью функции row_number(), которую mysql не поддерживает (пока?). Если вам нужны только два значения, я могу предложить выполнить группу и выполнить min() и max() в одной строке.   -  person Gordon Linoff    schedule 23.05.2012
comment
Вот хорошая статья о имитации функции row_number() в mySql . Когда у вас есть row_number() для каждой группы, вы можете просто фильтровать записи с rn ‹= 2 или любым другим, что вам нужно в данный момент.   -  person Nikola Markovinović    schedule 23.05.2012
comment
Не могли бы вы предоставить полный запрос и соответствующее определение таблицы?   -  person J A    schedule 23.05.2012
comment
Всем спасибо за потраченное время и советы. Я сейчас не за компьютером, но похоже, что одно или все предложенные решения будут работать.   -  person Kohjah Breese    schedule 23.05.2012
comment
У меня была аналогичная проблема некоторое время назад, и первый ответ здесь работал хорошо table" title="mysql выбирает x лучших записей для каждого человека в таблице"> stackoverflow.com/questions/9969126/   -  person Exupery    schedule 23.05.2012
comment
Спасибо Экзюпери. Это сделало свое дело.   -  person Kohjah Breese    schedule 23.05.2012
comment
Изучив это немного подробнее, решения, предоставленные Николой и Экзюпери, работают только тогда, когда нет соединения. В противном случае вы получите что-то вроде этого: title catRef rowNumber Item1 1 1 Item2 1 2 Item3 1 3 Item4 2 1 Item5 1 1, то есть он обрабатывается по мере его выхода из БД, а не упорядочивается в столбце, по которому вы хотите сгруппировать. Расследование....   -  person Kohjah Breese    schedule 23.05.2012


Ответы (2)


Как насчет использования подзапроса в файле join. Я не был уверен, к какой таблице относятся refID и resID, но.....

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 ...
person Kyra    schedule 22.05.2012
comment
не проверял это, но я бы попробовал, возможно, с предложением order by в подзапросе - person ErichBSchulz; 07.07.2012

В отсутствии оконных функций из MySQL ответ не тривиален. Вот трюк, который выбирает первые N записей для каждой группы, используя MySQL GROUP_CONCAT: MySQL: выбор первых N записей в группе.

Будучи агрегатной функцией, GROUP_CONCAT можно манипулировать, чтобы обеспечить конкатенацию строк в нужном порядке. Используя манипуляции с текстом, строка анализируется. Необязательно, значения приводятся к правильным типам.

person Shlomi Noach    schedule 06.07.2012