繁体   English   中英

根据上一行中的日期获取下一行的内容

[英]Get contents of next row based on date in previous row

我有一个历史记录表,其中包含对数据所做的更改以及进行更改的日期-历史记录是旧值以及进行更改的日期。

然后有一个包含当前值的主表。

实际的表格布局如下:

history

id user_id colour change_date
1  1       Red    2016-01-01 
2  1       Blue   2016-04-05
3  1       Green  2016-08-05

接着:

current

user_id colour entry_date
1       Yellow 2015-10-14 

我想尝试获取所有值的时间顺序列表,以便user_id 1的输出如下所示:

2015-10-14 Red
2016-01-01 Blue
2016-04-05 Green
2016-08-05 Yellow

目前,我将每个用户都放在用户表中,并检查他们是否具有历史记录值-如果没有,那么输出就是:

2015-10-14 Yellow

但是,当它们确实具有历史记录时,我必须从输入日期开始,并为其分配第一个颜色历史记录并存储在数组中。

然后,我获取第一个历史记录日期并获取第二个历史记录值(通过另一个查询),并将其存储在数组和循环中,依此类推-有15万个用户,每个用户可以进行20或30个更改,效率非常低!

我想在PHP或MySQL中找到一种更有效的方法-有人可以帮忙吗?

首先,我不确定您决定使用哪种连接类,但是为此,我将提供我编写用于查询的使用PDO的类。

class Entity extends PDO {
    public function __construct(
    ) {
        try {
            parent::__construct(
               'mysql:host=localhost;dbname=example',
               'db_user',
               'db_pass'
            );
        } catch (PDOException $ex) {
            die($ex->getMessage());
        }
    }

    public function query(
        $statement,
        $values = array()
    ) {
        $stmp = parent::Prepare($statement);
        $stmp->execute($values);
        return $stmp;
    }
}

现在,假设您已经知道user_id ,则可以开始通过数据库查询以检索更改日志。

$con = new Entity();
$user_id_example = 1;

$sql = 'SELECT colour, change_date FROM history WHERE user_id = ? ORDER BY change_date ASC';

var_dump($con
    ->query($sql, [$user_id_example])
    ->fetchAll()
);

更新:如果您试图获取最新的更改日志,则可以在查询中添加一个LIMIT

$sql = 'SELECT colour, change_date FROM history WHERE user_id = ? ORDER BY change_date ASC LIMIT 1';

更新:注意,如果要将结果从表当前值和历史记录中删除,则可以使用INNER JOIN

$sql = 'SELECT colour, change_date FROM history h INNER JOIN current c ON h.change_date = c.change_date WHERE user_id = ? ORDER BY change_date ASC';

我向您提出两个查询,在第一个查询中,您将对颜色进行排序,在第二个查询中,您将对日期进行排序,因此,在php中,您将拥有两个带有数据的数组,并且仅可将数据放在一起。
有代码,只需要将连接设置为数据库

$sqlColour = "select c.user_id, u.colour from current as c inner join ( select user_id, colour from history union all select user_id , colour from current ) u on c.user_id=u.user_id";
$sqlDate = "select c.user_id, u.date from current as c inner join ( select user_id, entry_date as date from current union all select user_id , change_date as date from history ) u on c.user_id=u.user_id";

$stmt = $db->query($sqlColour);
$colours = $stmt->fetchAll();
$stmt = $db->query($sqlDate);
$dates = $stmt->fetchAll();

$answer = array();
for ($i = 0; $i < count($colours); $i++) {
    $answer[] = array("date" => $dates[$i]['date'], "colour" => $colours[$i]['colour'], "user_id" => $colours[$i]['user_id']);
}
echo $answer;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM