0

これは私がまだ解決できていない質問なので、必要なものをより明確にする必要があるかもしれません。

毎月受信して MySQL データベースにアップロードするデータソースがあります。最も役立つ形式ではないかもしれませんが、データを変更することはできません。次のようになります。

Ref    Action  Date/Time          User      Location
00123  Create  01:02:12_09:13:13  J Jones   Home  
00456  Create  01:02:12_09:13:13  J Jones   Home  
00123  Revise  03:02:12_15:20:01  A Smith   Home   
00789  Create  01:02:12_09:13:13  J Jones   Home  
00123  Delete  05:02:12_10:51:45  B Halls   Home

×1000台

最初のイベント (Create イベント) によって生成される参照番号に対して発生するイベントを追跡します。これらのイベントはさまざまな間隔で発生し、さまざまな場所でさまざまな人々によって行われます。

上記の例を使用して、特定の月のデータをループし、参照番号とその「作成」イベントを取り出し、その参照番号の他のすべてのイベントを見つける必要があります。

次に、この情報を操作できるようにする必要があります。たとえば、作成と改訂、改訂と削除の時間差を計算し、誰がどこでそれらを行ったかを計算します。

月または日付範囲で作成されたすべての参照番号に対してこれを行う必要があります。

だから私はこれを行うことができるクエリを作成できることを望んでいます-ref番号を見つけ、他のイベントを見つけ、何らかの方法でそれらをつなぎ合わせます-最終的に新しいデータを取得します-

参照番号、作成時刻、作成者、改訂時刻/作成者、削除時刻など

この新しいデータを新しいテーブルに格納できれば便利だと思います(?)

これは、クエリとして、またはおそらくクエリと PHP (配列?) の組み合わせとして実行できますか?

4

2 に答える 2

0

さて、最初の段階はこのデータをMySQLテーブルに変換することであり、次のようなものになります。

ref integer,
action  enum('create','revise','delete'),  -- ordered by life cycle: create first, delete last
ts  timestamp,
user    varchar(32),    -- or maybe user_id
loc varchar(32),    -- again maybe location_id, or ENUM

だから、その参照を与えられたイベントを引き出すために

SELECT * FROM mytable WHERE ref = 123 ORDER BY action;

使用できる日付範囲

WHERE ts BETWEEN 'date1' AND 'date2'

時差を取得するには、

SELECT TIMEDIFF(b.ts, a.ts) AS delta, b.*
    FROM mytable AS a
    JOIN mytable AS b ON (a.action = 'CREATE' AND a.ref = b.ref)
    WHERE a.ref = 123;

最後に、テーブルを非正規化します。

SELECT _create.*,
    TIMEDIFF(_revise.ts - _create.ts) AS revise_delta,
    TIMEDIFF(_delete.ts - _delete.ts) AS delete_delta,
FROM mytable AS _create
    LEFT JOIN mytable AS _revise ON (_create.ref = _revise.ref
               AND _create.action = 'CREATE' AND AND _revise.action = 'REVISE' AND ***)
    LEFT JOIN mytable AS _delete ON (_create.ref = _delete.ref
               AND _create.action = 'CREATE' AND AND _delete.action = 'DELETE' AND ***)
;

ここで*は、CREATEイベントと対応するDELETEイベントの間の一意の関係を識別するためのいくつかの方法です。

refが一意である場合、それAND ***は必要ありません(*はTrueに等しい)。

たとえば、参照が毎月リサイクルされ、イベントが2か月に及ぶことは決してない場合、_createの年と月は_reviseの年と月と同じである必要があります。それと.refの同等性は、二義的な一致を確立します。

そうしないと、はるかに複雑になりVIEWます。CREATEイベントごとに、同じ参照で現在と同じかそれ以上の最も早いイベントの日時と日時をCOALESCE選択するように作成してみます。このようにして、その参照を持つイベントがその特定のCREATEに起因する「ウィンドウ」を識別します。しかし、これは決して起こらないという仮説に基づいていますNOW()CREATE

00123 CREATE 01-NOV-2012 Jack
00123 CREATE 04-NOV-2012 Jill
00123 DELETE 05-NOV-2012 Joe  <-- which event is this one?
于 2012-11-01T11:41:05.517 に答える
0

特定のアクションのフィールド値を取得するには、次のようにします。

$db_connection = mysqli_connect();//Have DB variables here
$ref = ;//Ref number here e.g 123
$action = '';//action to check for here e.g create

$query = "SELECT * FROM yourtable WHERE ref=".$ref." AND action=".$action."";
$q = mysqli_query($db_connection,$query);

while($row = mysqli_fetch_asocc($q)){

//The variables are in the $row array with each on an index based on a column name

}
于 2012-11-01T11:41:28.587 に答える