1

ログ情報(主にステータス変更)を格納するテーブルがあります

テーブルは次のようなものです。

+----+--------+----------+---------------------+
| id | number |  status  |      timestamp      |
+----+--------+----------+---------------------+
|  1 |     25 | buffered | 2012-05-05 23:10:10 |
|  2 |     25 | sent     | 2012-05-05 23:10:11 |
|  3 |     26 | not sent | 2012-05-05 23:10:12 |
|  4 |     27 | buffered | 2012-05-05 23:10:13 |
+----+--------+----------+---------------------+

ステータス別にレポートを生成する必要があります。ただし、番号のステータスは変更される可能性があります。

番号のステータスは、で始まり、後でまたはbufferedに変更できます。sentnot sent

sentまたは、またはで始めることができますnot sent。この場合、ステータスは変更されません。

sentこれらの条件で、問題なく、または問題なくグループ化できると思いますnot sent(これは正しいですか?)

しかし、どうすればbuffered行のみのレポートを生成できますか?

この特定のサンプルでは、​​次のように尋ねられた場合:バッファリングされている数値の正解は次のとおりです。number 27

PD

タイトルは質問を正確に反映していないと思います。より良いタイトルをお持ちの方は、お気軽に変更してください。

4

4 に答える 4

0
SELECT number, status FROM YOUR_TABLE t1 WHERE status  = :someStatus and NOT EXISTS (SELECT id FROM YOUR_TABLE t2 WHERE t1.id<>t2.id and t1.number = t2.number and t2.timestamp>t1.timestamp) 

数値フィールドとタイムスタンプフィールドに、クエリのパフォーマンスを保証するために作成された適切なインデックスが含まれていることを確認してください。

于 2012-10-04T20:36:55.720 に答える
0

テーブル名が「log_table」であると仮定すると、これにより、指定された番号の最新のステータスが提供されます。

 SELECT number, status FROM log_table  AS l WHERE timestamp = (SELECT MAX(timestamp) 
              FROM log_table WHERE number = l.number);

MYSQL に対する私の大きな願いの 1 つは、許可することです (ただし、現在はサポートされていません)。

SELECT number, status FROM log_table GROUP BY number HAVING MAX(timestamp);
于 2012-10-04T20:15:15.567 に答える
0

ここにクエリがあります(パフォーマンスを向上させるためにサブクエリはありません):

select distinct
    l1.id,  l1.number, l1.status, l1.timestamp 
from 
    my_logs l1 
 left outer joing
    my_logs l2
        on l1.number = l2.number and l2.status <> 'buffered'
where 
    l1.status = 'buffered' and
    l2.number is null

説明:

番号キーでテーブルを結合します。2 回目は、テーブルは「バッファリング」とは異なる値を持つ行のみを取得します。「second」テーブルに行が見つかった場合、それは、この数値で「バッファリング」された値とは異なる値であることを意味します。

于 2012-10-04T21:01:36.903 に答える
0

表示される順序ですべてのステータスをグループ化し、ステータス バッファリングで開始および終了するステータスのみを選択します (ステータス: バッファリングのみがあります)。

Select number, group_concat(status) allstatus 
from tablename
 group by number
 having allstatus regexp '^buffered$'
 order by timestamp
于 2012-10-04T21:19:22.250 に答える