2011-11-01 20 views
0

我有一組記錄,並且我想要獲取同一類型的兩個記錄之間的記錄集。MySQL:根據分隔符類型選擇一個有序記錄範圍

考慮這個樣本數據:

ID POSITION TYPE 
9 1   separator 
7 2   one 
8 3   three 
5 4   one 
2 5   separator 
4 6   two 
3 7   two 
6 8   separator 
1 9   four 
11 10   five 
10 11   three 
12 12   five 

我想從一個特定的分離器到下一個分離器或記錄集的結尾得到了記錄。

案件

  1. 創紀錄的2起,我就期望得到記錄4和3
  2. 創紀錄的6起,我就期望得到記錄1,11,10和12 。

我可以解決案例1有一個子查詢,像這樣:

SELECT * 
FROM table_name 
WHERE position > 5 
AND position < (
    SELECT MIN(position) 
    FROM table_name 
    WHERE position > 5 
    AND type = 'separator' 
) 
ORDER BY position ASC 

該解決方案將不適用於案例2,並且似乎應該有一種方法,不使用子查詢。


SOLUTION

我的解決方案是基於喬治的回答,和作品,但我擔心它的潛力,因爲聚結功能和子查詢的缺乏表現力。

SELECT * 
FROM table_name 
WHERE `position` > 5 
AND `position` < COALESCE(
    (SELECT MIN(`position`) 
     FROM table_name 
     WHERE `position` > 5 
     AND `type` = 'separator'), 
    (SELECT MAX(`position`) + 1 
     FROM table_name)) 
ORDER BY `position` ASC 

回答

1

我認爲這解決了第二種情況,以及第一:

SELECT * 
FROM table_name 
WHERE position > 8 
AND 
(position < (
    SELECT MIN(position) 
    FROM table_name 
    WHERE position > 8 
    AND type = 'separator' 
) OR 
    position <= (SELECT MAX(position) FROM table_name) 
) 
ORDER BY position ASC 

當然,你可以先計算MAX(ID),並插入一個常數。 OR子句可能會導致性能下降,所以如果我在處理大型數據集時不使用它,因爲第二種情況是解決第一種情況的SQL的唯一例外。

+0

這看起來很乍看,但它沒有處理第二種情況。 – Sonny

+0

你說得對,我只是編輯了答案。我猜它現在會起作用。 – wisefish

+0

它現在適用於第二種情況,但不是第一種情況。如果你在下面加入我的答案,我會刪除我的答案並接受你的答案。 – Sonny