2010-04-28 56 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