我有一个历史记录表,其中包含对数据所做的更改以及更改的日期 - 历史记录是旧值和更改的日期。
然后有一个包含当前值的主表。
实际的表格布局如下:
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
然而,当他们确实有历史记录时,我必须从输入日期开始,并为其分配第一个颜色历史记录并存储在数组中。
然后我获取第一个历史日期并获取第二个历史值(通过另一个查询)并将其存储在数组和循环中等等 - 有150k个用户,每个可以有20或30个更改,这是非常可怕的低效!
我想在PHP或MySQL中找到一种更有效的方法 - 任何人都可以帮忙吗?
答案 0 :(得分:0)
首先,我不确定您决定使用哪种连接类,但为此,我将提供一个我写入查询的类,它使用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';
答案 1 :(得分:0)
我建议你两个查询,在第一个你将有颜色订购,在第二个你将有订购的日期,所以,在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;