2015-04-15 51 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 

注意,值對於每個UNION,m和n的偏移和極限是相同的。

我想的是,不使用UNION查詢,而是說像

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

但保留LIMIT的每個子集的單獨的應用程序。

回答

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; 

編輯:

如果只在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 
       ); 

我m不是100%肯定的,但是這應該利用t1(fk_id, date_created)t1(id)上的索引。如果它使用這些索引,那麼它應該工作得很好。

+0

「這很瘋狂,但它可能只是工作!」 :-) - 謝謝,我會試一試。 –

+0

感謝你們,錯誤1235(42000)的第二個錯誤:這個版本的MySQL還不支持'LIMIT&IN/ALL/ANY/SOME子查詢',但你的第一個答案是有效的,在WHERE rn> = m和rn

+0

@BillHails。 。 。糟糕,我忘記了MySQL的限制。該語法適用於大多數其他數據庫。 –

相關問題