1

「ログ」と「セッション」の 2 つのテーブルがあります。ログには、logID、logName、logDateTime、および sessionID があります。セッションには、sessionID と sessionName があります。

ログはセッションの一部である必要はありませんが、可能です。セッションの一部でない場合、logs.sessionID フィールドは NULL です。セッションの一部である場合、関連する sessionID は logs.sessionID にあり、セッション テーブルと関連付けられます。

目標: これは、titanium studio を使用して開発された私の iPhone アプリケーションの一部です。セッションに複数のログがある場合を除き、各ログが行であるテーブルビューを作成する必要があります。その場合、セッション名を含む行が作成され、セッションの logNames を含むラベルが sessionRow に追加されます。テーブルビューの行は日時順に並べる必要があり、特定のセッションの日時はそのログの最新のものによって計算されます。テーブルビューとして視覚化するには...


12-12-12 logName1


12-11-12 logName2


セッション名

logName3、logName4、logName5


12-10-12 logName6


セッション名2

logName7、logName8、logName9


問題:クエリ/ソートの観点からこれを処理する方法がよくわかりません。私は多くのアイデアを考えましたが、それらはすべて問題を抱えているようです。このテーブルビューのUIを構築するための助けを求めているのではなく、単にデータを処理するソリューションを探しています.

進行中の作品:

**OPTION 1:**

var rowArray=[];
var ignoreArray=[];

var rows = select logID, logName, logDateTime, logs.sessionID, sessionName
           FROM logs, sessions WHERE logs.sessionID=sessions.sessionID OR
           logs.sessionID IS NULL ORDER BY logDateTime DESC, logs.sessionID;

while(rows.isValidRow()){
    var logSessionID = rows.fieldByName('sessionID');

    if(logSessionID){//if the current log is part of a session
        //1. check ignoreArray to see if this session has
             already been created. If not, continue steps 2-4.
        //2. create a tableview row with the sessionName
        //3. loop through all rows, and add the logName to the row created above
             ONLY when it contains the current sessionID
        //4. add session row to rowArray
        //5. put current sessionID into ignoreArray, so that there won't be
             duplicate session rows.
    }else{
        //1. create a regular log row, as it is not part of a session
        //2. add log row to rowArray
    }

    rows.next();
}

//everything is complete, set the array of data to the tableview
tableview.setData(rowArray);

オプション 1 に関する私の懸念/質問:

  1. 新しいセッションに入るたびにすべての行をループするため、非常に非効率的ですか?

  2. 数千ではないにしても、数百のログで遅くなりますか?

  3. すべての行 (ネスト) をループしている最中に、すべての行をループするにはどうすればよいですか?

    オプション 2:

    var presortArray=[];
    
    var logs = select * from logs WHERE sessionID IS NULL;
    var sessionlogs = select * from logs WHERE sessionID IS NOT NULL;
    var sessions = select * from sessions;
    
    while(logs.isValidRow()){
        //1. create log row, push to presortArray;
    };
    while(sessions.isValidRow()){
        //1. create session row
        //2. loop through sessionlogs, adding each to the session row
             that contains the current sessionID. Make sure the session
             Row gets a custom date field for future array sorting
        //3. push session row to presortArray
    };
    
    //all rows are now in presortArray.
    var sortArray = //find a way to sort the rows in presortArray based on datetime
    
    tableview.setData(sortArray);
    

オプション 2 に関する私の懸念/質問:

  1. 配列内の各オブジェクトのカスタム フィールドに基づいて、何らかの形式の配列並べ替えを使用すると遅くなるでしょうか?

  2. 「sessionLogs」を何度もループできますか?ループするたびに最初の行に戻す方法はありますか?

最も重要な質問: 今、私の目標と進行中の作業を説明するために真剣に努力しました。私がまだ気付いていない、これを行うためのはるかに簡単な方法はありますか?

4

1 に答える 1

1

この例のデータでは:

CREATE TABLE logs(logID, logName, logDateTime, sessionID);
CREATE TABLE sessions(sessionID, sessionName);
INSERT INTO sessions VALUES (1, 'sessionName'), (2, 'sessionName2');
INSERT INTO logs VALUES (1, 'logName1', '2012-12-12', NULL),
                        (2, 'logName2', '2012-11-12', NULL),
                        (3, 'logName3', '2012-11-01', 1),
                        (4, 'logName4', '2012-11-02', 1),
                        (5, 'logName5', '2012-11-03', 1),
                        (6, 'logName6', '2012-10-12', NULL),
                        (7, 'logName7', '2012-10-01', 2),
                        (8, 'logName8', '2012-10-02', 2),
                        (9, 'logName9', '2012-10-03', 2);

次のクエリ:

SELECT logID,
       NULL AS sessionID,
       logDateTime,
       logName,
       NULL AS NamesInRandomOrder
FROM logs
WHERE sessionID IS NULL

UNION ALL

SELECT NULL,
       sessions.sessionID,
       MAX(logDateTime),
       sessionName,
       group_concat(logName)
FROM logs JOIN sessions ON logs.sessionID = sessions.sessionID
GROUP BY sessions.sessionID

ORDER BY 3 DESC

この出力が得られます:

logID  sessionID  logDateTime  logName       NamesInRandomOrder
-----  ---------  -----------  ------------  --------------------------
1                 2012-12-12   logName1
2                 2012-11-12   logName2
       1          2012-11-03   sessionName   logName3,logName4,logName5
6                 2012-10-12   logName6
       2          2012-10-03   sessionName2  logName7,logName8,logName9

 


を順序付けたい場合logNameは、次のクエリを使用できます。

SELECT logID,
       sessions.sessionID,
       logDateTime,
       sessionName,
       logName
FROM logs LEFT JOIN sessions ON logs.sessionID = sessions.sessionID
ORDER BY logDateTime DESC

これにより、次の出力が得られます。

logID  sessionID  logDateTime  sessionName   logName
-----  ---------  -----------  ------------  --------
1                 2012-12-12                 logName1
2                 2012-11-12                 logName2
5      1          2012-11-03   sessionName   logName5
4      1          2012-11-02   sessionName   logName4
3      1          2012-11-01   sessionName   logName3
6                 2012-10-12                 logName6
9      2          2012-10-03   sessionName2  logName9
8      2          2012-10-02   sessionName2  logName8
7      2          2012-10-01   sessionName2  logName7

これにより、1 つのセッションのログ リストの最後に到達したときに、コードをチェックインする必要があります。

于 2013-02-19T08:53:04.087 に答える