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

x 1000 的

它根据参考号跟踪发生的事件,参考号由第一个事件(创建事件)生成。这些事件以不同的时间间隔发生,并且由不同地点的不同人完成。

使用上面的示例,我需要能够遍历特定月份的数据,提取参考编号及其“创建”事件,然后找到该参考编号的所有其他事件。

然后我需要能够操作这些信息,例如计算创建和修改之间的时间差,然后是修改和删除,以及谁在哪里做的。

对于在月份或日期范围内创建的所有参考编号,我需要能够做到这一点。

所以我希望我可以创建一个可以做到这一点的查询 - 找到一个参考号,找到其他事件,以某种方式将它们串在一起 - 这样最终我就有了新数据 -

参考编号、创建时间、创建人、修改时间/人、删除时间等

如果可以将这些新数据存储在新表中,那将很有用,我认为(?)

这可以作为查询或查询和 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 事件之间唯一关系的某种方式。

如果 refs 是唯一的,则AND ***不需要(*等于 True)。

例如,如果每个月都会回收 refs,并且从来没有发生过一个事件可能跨越两个月,那么您可以强制 _create 的年月与 _revise 的年月相同;那和 .ref 的相等性建立了双义匹配。

否则它会变得更加复杂,我会尝试VIEW为每个 CREATE 事件创建一个,选择具有相同 ref 但 ts 大于或等于当前事件的最早事件的COALESCEof和 datetime。通过这种方式,您可以识别一个“窗口”,其中具有该引用的事件归因于该特定 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 回答