2010-04-28 49 views
2

我有一個sql/sqlite的問題。我需要編寫一個從sqlite數據庫表中選擇一些值的查詢。我總是希望最大返回記錄爲20.如果所選記錄總數超過20,我需要選擇20條均勻分佈(不隨機)記錄的記錄。在日期排序時,我總是從表中選擇第一個和最後一個值也很重要。這些記錄應該插入結果中的第一個和最後一個。Sqlite:選擇記錄遍佈整個記錄

我知道如何在代碼中做到這一點,但它會是一個完美的sqlite查詢可以做到這一點。

現在使用的查詢林是非常簡單的,看起來像這樣:

"SELECT value,date,valueid FROM tblvalue WHERE tblvalue.deleted=0 ORDER BY DATE(date)" 

如果我例如有這些記錄在talbe並作出一個更簡單的例子,我想最大的結果是5

id value date 
1  10  2010-04-10 
2  8  2010-04-11 
3  8  2010-04-13 
4  9  2010-04-15 
5  10  2010-04-16 
6  9  2010-04-17 
7  8  2010-04-18 
8  11  2010-04-19 
9  9  2010-04-20 
10 10  2010-04-24 

我想,均勻地塗布這樣的結果:

id value date 
1  10  2010-04-10 
3  8  2010-04-13 
5  10  2010-04-16 
7  8  2010-04-18 
10 10  2010-04-24 

希望,電子xplain我想要什麼,謝謝!

+0

你是什麼意思「,我需要選擇20條記錄上展開的記錄總數超過「? – SQLighter 2010-04-28 13:29:54

+1

我認爲他的意思是隨機化的集合,即按隨機因素排序 – 2010-04-28 13:39:41

+0

對不起,我不清楚,我不想隨機。請參閱上面更新的問題。謝謝! – Mrbiggerm 2010-04-28 14:12:11

回答

0

我想你想要這樣的:

SELECT value,date,valueid FROM tblvalue WHERE tblvalue.deleted=0 
ORDER BY DATE(date), Random() 
LIMIT 20 
+0

引用OP:「當排序日期爲」 – 2010-04-28 13:43:47

+0

「時,我總是從表格中選擇第一個和最後一個值也很重要,謝謝,但是我希望記錄不是隨機分佈的。我之前並不清楚,更新了我的問題。 – Mrbiggerm 2010-04-28 14:14:25

2

像這樣的東西應該爲你工作:

SELECT * 
FROM (
    SELECT v.value, v.date, v.valueid 
    FROM tblvalue v 
    LEFT OUTER JOIN (
     SELECT min(DATE(date)) as MinDate, max(DATE(date)) as MaxDate 
     FROM tblvalue 
     WHERE tblvalue.deleted = 0 
    ) vm on DATE(v.date) = vm.MinDate or DATE(v.date) = vm.MaxDate 
    WHERE tblvalue.deleted = 0 
    ORDER BY vm.MinDate desc, Random() 
    LIMIT 20 
) a 
ORDER BY DATE(date)  
+0

這將以奇怪的順序返回記錄。首先是最短日期,然後是最長日期,然後是中間的18。我認爲它需要另一個外部查詢才能正確排序。 – 2010-04-28 13:51:23

+0

@Sam:是的,沒有指定,所以我跳過它。順序是確保最小和最大日期得到返回。我更新了包括一個外部查詢適當的排序。 – RedFilter 2010-04-28 13:58:21

+0

但是這隻會選擇一些隨機記錄? – Mrbiggerm 2010-04-28 21:39:09