3

以下のクエリを使用して、各行に ID、日付/時刻、およびキー アクション (およびその他のデータ) が含まれるデータのテーブルを調べます。このテーブルは変更できず、私の手に負えません。

クエリは、作成アクション (常に最初のアクション) の発生を検出し、作成の ID と日付/時刻を取得してから、他の主要なアクション (情報の追加、申請の予約、承認) の日付/時刻を 1 行で取得します。データ:

SELECT _create.ID AS ID, 
_create.`datetime` AS Create, 
_inform.`datetime` AS Add_Info,
_bookap.`datetime` AS Book_Appt,
_accept.`datetime` AS Accept,
FROM table AS _create
LEFT JOIN table AS _inform ON (_create.ID = _inform.ID AND _inform.action = 'Add Info')
LEFT JOIN table AS _bookap ON (_create.ID = _bookap.ID AND _bookap.action = 'Book Appt')
LEFT JOIN table AS _accept ON (_create.ID = _accept.ID AND _accept.action = 'Accept')
WHERE _create.action="Create"

だから私は次のようなものを得る:

ID  -  Create Date - Inform Date - Bookap Date - Accept Date
1234   01/02/2013    02/02/2013    09/02/2013    10/02/2013 

これはうまくいきます。

ただし、クエリが同じ ID の「Book Appt」などの同じタイプの 2 つのイベントを検出した場合 (これは時々発生する可能性があります)、その ID の 2 行のデータを取得します。だから私は得る:

ID  -  Create Date - Inform Date - Bookap Date - Accept Date
1234   01/02/2013    02/02/2013    09/02/2013    10/02/2013 
1234   01/02/2013    02/02/2013    15/02/2013    10/02/2013     

2 番目の発生を無視し、ID ごとに 1 行だけを返す必要があります。または、Bookap Date1 と Bookap Date2 を示す行を返すことをお勧めします。

何か案は?

4

4 に答える 4

3

GROUP BYレコードを 1 つの行にグループ化しmin()、最も早いイベント日を選択するために使用します。

SELECT _create.ID AS ID, 
min(_create.`datetime`) AS Create, 
min(_inform.`datetime`) AS Add_Info,
min(_bookap.`datetime`) AS Book_Appt,
min(_accept.`datetime`) AS Accept,
FROM table AS _create
LEFT JOIN table AS _inform ON (_create.ID = _inform.ID AND _inform.action = 'Add Info')
LEFT JOIN table AS _bookap ON (_create.ID = _bookap.ID AND _bookap.action = 'Book Appt')
LEFT JOIN table AS _accept ON (_create.ID = _accept.ID AND _accept.action = 'Accept')
WHERE _create.action="Create"
GROUP BY _create.ID;

すべてのイベントの日付を表示しながら 1 行を返す手っ取り早い方法は、上記のクエリのgroup_concat()代わりに関数を使用することです。min()これにより、複数datetimeの が 1 つの列に配置され、アプリ レイヤーが解析する必要があります。

于 2013-01-30T17:42:47.757 に答える
0

確かに、句GROUP BY _create.IDの後に使用してください。WHERE

于 2013-01-30T17:41:38.723 に答える
0

Book_Appt単一の行で複数の値を返したい場合は、次のGROUP_CONCATように使用できます。

SELECT _create.ID AS ID, 
_create.`datetime` AS Create, 
_inform.`datetime` AS Add_Info,
GROUP_CONCAT(_bookap.`datetime`) AS Book_Appt,
_accept.`datetime` AS Accept,
FROM table AS _create
LEFT JOIN table AS _inform ON (_create.ID = _inform.ID AND _inform.action = 'Add Info')
LEFT JOIN table AS _bookap ON (_create.ID = _bookap.ID AND _bookap.action = 'Book Appt')
LEFT JOIN table AS _accept ON (_create.ID = _accept.ID AND _accept.action = 'Accept')
WHERE _create.action="Create"
GROUP BY `ID`

これは、あなたの場合、日時値のコンマ区切りのリストを返します。

したがって、出力は次のようになります

ID  -  Create Date - Inform Date - Bookap Date      -       Accept Date
1234   01/02/2013    02/02/2013    09/02/2013,15/02/2013    10/02/2013 
于 2013-01-30T17:44:28.610 に答える
0

最初の質問 (1 行のみを返す) では、ORDER BY句を使用して結果セットを並べ替え、その後にLIMIT 11 行のみを返す式を使用します。

于 2013-01-30T17:59:53.107 に答える