2015-04-15 2 views
0

Это мой первый пост здесь, поэтому извиняюсь, если я нарушаю протокол.Применять OFFSET и LIMIT отдельно к подразделам результата

У меня есть одна таблица, которая ради аргумента я называю t1, таблица выглядит следующим образом:

id -- primary key 
fk_id -- foreign key 
date_created 

У меня есть набор fk_id из предыдущего запроса.

Вот запрос, который возвращает именно то, что я хочу, но использует UNION, и было бы очень неэффективно для сотен или, возможно, тысячи fk_id я, возможно, придется искать по:

SELECT * 
    FROM t1 
    WHERE fk_id = ? 
ORDER BY date_created DESC 
    LIMIT m, n 
UNION 
    SELECT * 
    FROM t1 
    WHERE fk_id = ? 
ORDER BY date_created DESC 
    LIMIT m, n 
UNION -- ... for each fk_id 

Обратите внимание, что значения m и n для смещения и предела одинаковы для каждого UNION.

То, что я хотел бы запрос, который не использует UNION и вместо этого говорит что-то вроде

WHERE fk_id IN (?, ?, ?, ...) 

, но сохраняет за собой отдельное приложение к предельному каждому подмножеству.

ответ

0

Вам необходимо присвоить номер строки каждому fk. Лучший способ, вероятно, использовать переменные:

SELECT t.* 
FROM (SELECT t1.*, 
      (@rn := if(@f = fk_id, @rn + 1, 
         if(@f := fk_id, 1, 1) 
         ) 
      ) rn 
     FROM t1 CROSS JOIN 
      (SELECT @f := -1, @rn := 0) vars 
     ORDER BY fk_id, date_created DESC 
    ) t 
WHERE rn >= m and rn < m + n; 

EDIT:

Если только MySQL поддерживает следующие (почти) синтаксис ANSI, то это может быть более эффективным:

select t1.* 
from t1 
where t1.id in (select id 
       from t1 tt1 
       where tt1.fk_id = t1.fk_id 
       order by date_created desc 
       limit m, n 
       ); 

Я м не на 100%, но это должно использовать индексы на t1(fk_id, date_created) и t1(id). Если он использует эти индексы, то он должен работать очень хорошо.

+0

«Это сумасшествие, но это может сработать!» :-) - Спасибо, я попробую. –

+0

Спасибо за это, второй пример ошибок с 'ERROR 1235 (42000): эта версия MySQL еще не поддерживает« LIMIT & IN/ALL/ANY/SOME subquery », но ваш первый ответ работает, есть выход -one error на 'WHERE rn> = m и rn

+0

@BillHails. , , К сожалению, я забыл об ограничении MySQL. Синтаксис работает в большинстве других баз данных. –

Смежные вопросы