8

データベースにクエリを実行して、2 つの異なる ID でデータを含むテーブルを表示し、行ごとに各 ID を交互に並べながら、時間順に並べ替えるにはどうすればよいですか。例えば。データベースには ID1 の要素が 10 個、ID2 の要素が 10 個あります。

私はそれが必要です:

ID1 #data #2minutes ago

ID2 #data #15minutes ago

ID1 #data #4minutes ago

ID2 #data #50minutes ago

何か案は?

更新: ID の数は 1 から n まで異なる必要があり、現在 SQLite.query() メソッドを使用してこれを実行しようとしています。

更新 2: #data は、1 つだけでなく、その行内のデータの列を表すため、たとえば 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 クエリなどの非常に単純なソリューションを優先 します。

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. 時間/IDx オーダーのステートメント内で ORDER BY を使用
します。

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

4. 両方のセットにリスト識別子を追加する
5. UNION を使用して両方の結果セットを結合する
6. その結合リストから選択し、(rownum||set identifier) として構築されるフィールドを作成する
7. 作成したフィールドに ORDER BY を追加する全体の表現

更新:これはむしろ 2 つのテーブルを対象としていました。上記の更新の例を見て、いくつかのことを試した後、単一の SQL でそれをコーディングするのはかなり難しいと思います (SQLite を使用)

于 2013-02-20T20:47:17.383 に答える
0

あなたのデータは非常にうまく整理されていないようです。タイプのみが異なる一見同一のデータの複数のテーブルがある場合、データは代わりにタイプ列を持つ1つのテーブルに格納する必要があります。

テーブルチェックイン(id、user、datetime)とテーブルチェックアウト(id、user、datetime)を検討してください。これらは、テーブルチェックイン(id、user、datetime、inorout)にマージできます。

データが最適に構造化されている場合、そのデータを処理するためのクエリの設計がはるかに簡単になります。

また、cf。正規化またはhttp://en.wikipedia.org/wiki/Database_normalizationに関するチュートリアル

于 2013-03-01T20:42:18.237 に答える
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

何かのようなもの:

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

私が見つけた唯一の解決策は、2つのクエリを実行することです

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 に答える