8

如何查询数据库以显示包含两个不同 ID 的数据的表,但每行交替每个 ID,但仍按时间排序。例如。数据库有 10 个 ID1 元素和 10 个 ID2 元素。

我需要它是:

ID1 #data #2minutes ago

ID2 #data #15minutes ago

ID1 #data #4minutes ago

ID2 #data #50minutes ago

有任何想法吗?

更新:ID 的数量必须能够从 1 到 n 不同,而且我目前正在尝试通过 SQLite.query() 方法来做到这一点。

更新 2:#data 表示该行中的数据列,而不仅仅是一个,因此例如可能有 5 列。此外,数据必须通过游标返回。

更新3:进一步阐述,下面是我试图达到的表格和预期结果。

输入表(按时间排序)..

id | name | number | time
01   Tim    561481   2 minutes ago
02   Jon    951484   5 minutes ago
02   Jon    978284   7 minutes ago
04   Zen    171484   15 minutes ago
04   Zen    171484   17 minutes ago
03   Ken    468488   20 minutes ago
02   Jon    978284   32 minutes ago

和输出:注意,我需要在可能的情况下在数据库中替换 Id,但仍然按时间排序整个事情,例如:

id | name | number | time
01   Tim    561481   2 minutes ago
02   Jon    951484   5 minutes ago
04   Zen    171484   15 minutes ago
03   Ken    468488   20 minutes ago
02   Jon    978284   7 minutes ago
04   Zen    171484   17 minutes ago
02   Jon    978284   32 minutes ago

更新 4:更喜欢一个非常简单的解决方案,例如复杂而干净的 sql 查询等。 更新 5:尽管不得不放弃赏金,但这个问题仍然没有得到一个简单的解决方案来做我想做的事情。

4

6 回答 6

2
SELECT t.id, t.time, 
    (
        SELECT count(*) 
        FROM tab u 
        WHERE u.id = t.id AND u.time < t.time 
        ORDER BY u.time
    ) counter 
FROM tab t 
ORDER BY counter, t.time

我希望我正确理解了你的问题。

随机数据的输出:

id  time  counter
2   2   0
0   7   0
4   16  0
1   21  0
3   50  0
2   5   1
1   29  1
0   32  1
4   38  1
3   69  1
2   25  2
1   30  2
0   37  2
4   53  2
2   51  3
4   59  3
0   87  3
4   62  4
2   73  4
0   90  4

不要忘记使用索引。

于 2013-02-25T22:43:54.643 回答
1

尝试以下操作:
1. 为两个集合(ID1 的项目和 ID2 的项目)创建 SELECT 语句
2. 在这些语句中使用 ORDER BY 来获取时间/IDx 顺序
3. 添加一列

(SELECT COUNT(*) FROM table AS tab2 WHERE tab2.item <= tab1.item) AS rownum

4. 为两个集合添加列表标识符
5. 使用 UNION 来联合两个结果集
6. 从该联合列表中选择并组成一个构建为 (rownum||set identifier)
的字段 7. 添加一个 ORDER BY 组合字段到整个表达

更新:这更适用于两张桌子;在查看了上面的示例更新并尝试了一些事情之后,我认为在单个 SQL 中编写代码相当困难(使用 SQLite)

于 2013-02-20T20:47:17.383 回答
0

我发现您执行两个查询的唯一解决方案

首先查询按ID和日期排序的数据

SELECT ID,
       Date,
       COUNT(1) AS TotalRows
FROM Table
ORDER BY ID, Date

然后查询你拥有的不同ID,存储在一个数组中,我们称之为idsArray

SELECT COUNT(1) FROM Table GROUP BY ID

将第一个查询的所有结果读入 Queue: 伪代码:

Queue<YourData> yourQueue = // read it from database cursor

ArrayList sortedData = new ArrayList();

YourData d = null;

String lastId = null;

int position = 0;

while((d = yourQueue.dequeue()) != null) {

    if (lastId == null || d.id.equals(idsArray[position])) {

        sortedData.add(d);

        lastId = d.id;

        if (position < idsArray.length -1) {
            position ++;
        } else {
            position = 0;
        }
    } else {
        yourQueue.enqueue(d);
    }

}
于 2013-02-20T21:00:25.953 回答
0

就像是:

select a, b, c from (
    select a, b, c, rank = row_number() over (order by time) * 2 FROM ID1
    UNION ALL
    select a, b, c, rank = row_number() over (order by time) * 2 + 1 FROM ID2 ) t
order by rank

[编辑:我的坏 - 在 SQLite 中不可用]

于 2013-02-20T20:23:13.800 回答
0

如果相同的 id 可能无法具有相同的时间,则此查询将起作用。

select id, name, rc from
(select id,  name , @rownum:=@rownum+1 as rc from tbl,
(select @rownum:=0) r 
order by (cast(substring(time,1,2) as UNSIGNED)/rc)*cast(ascii(substring(name, 1,1)) as unsigned), time asc) data

行号计算礼貌

我要做的就是为表中的每一行赋予一个权重因子。

于 2013-03-01T01:57:34.133 回答
0

您的数据似乎组织得很差。如果您有多个看似相同但仅类型不同的数据表,则应将数据存储在一个具有类型列的表中。

考虑表签入(id、用户、日期时间)和表签出(id、用户、日期时间),它们可以合并到表签出(id、用户、日期时间、inorout)中。

当数据结构优化时,您会发现处理该数据的查询更容易设计。

另请参阅。有关规范化的任何教程或http://en.wikipedia.org/wiki/Database_normalization

于 2013-03-01T20:42:18.237 回答