我已经在这里阅读了一些相似的主题,经过几个小时的敲击,我仍然无法让它工作。
我在MySQL中有2个表: - 预订 - booking_status_history
预订表的结构和数据:
id pt_id client_id timestamp notes
62 30 15 2015-02-02 07:00:00
booking_status_history表的结构和数据: (注意booking_id是上面预订表的外键)
id booking_id timestamp description details status
11 62 2015-02-02 00:40:42 Client made Booking (pending) test_detailsi pending
12 62 2015-02-02 00:40:45 PT confirmed booking (confirmed) test_details2 pending
18 62 2015-02-02 02:45:15 Client cancelled Booking (Medical Emergency) test_details3 pending
我想要实现的是从每个预订的状态列中获取最新值(此测试数据仅显示1个预订和3个历史值)。
目前我只是取消了所有的历史结果,而不仅仅是最新的一行。
我正在使用以下PHP MySQLi库:https://github.com/joshcam/PHP-MySQLi-Database-Class#join-method
这是我当前的代码,似乎返回了所有历史记录。我已经尝试过使用MAX和GROUPBY的变体,因为我在旧线程中看到过其他人的工作,但由于某些原因我不能将它应用于这种情况。
$date = date('Y-m-d H:i:s', time());
$this->db->join("booking_status_history h", "b.id=h.booking_id", "LEFT");
$this->db->where('client_id', $id_param);
$this->db->where('b.timestamp', $date, ">");
$this->db->where('h.status', 'pending');
$this->db->orderBy("b.timestamp","desc");
$next_booking = $this->db->get("booking b", NULL, "b.*, h.status");
return $next_booking;
从下面的输出中可以看出,这将返回所有3个历史值:
Array (
[0] => Array (
[id] => 62
[pt_id] => 30
[client_id] => 15
[timestamp] => 2015-02-02 07:00:00
[notes] => [status] => pending
)
[1] => Array (
[id] => 62
[pt_id] => 30
[client_id] => 15
[timestamp] => 2015-02-02 07:00:00
[notes] => [status] => pending
)
[2] => Array (
[id] => 62
[pt_id] => 30
[client_id] => 15
[timestamp] => 2015-02-02 07:00:00
[notes] => [status] => pending
)
)
我感谢不是每个人都会熟悉这个PHP库,所以即使有人可以通过原始SQL向我解释,那也很棒。
我尝试做的是(伪代码):
SELECT everything
FROM bothtables
WHERE booking.id=booking_status_history.booking_id
AND latest entry in booking_status_table
我希望这是有道理的。现在是早上5点,我整晚都在忙着拥有一个巨大的代码块。
谢谢!
答案 0 :(得分:1)
这似乎已经为我破解了!非常感谢Jhecht花时间帮助我: - )
SELECT b.*, h.booking_id, h.details, h.status FROM booking b JOIN booking_status_history h ON b.id = h.booking_id WHERE h.id = (SELECT MAX(id) FROM booking_status_history WHERE booking_id = b.id)
答案 1 :(得分:0)
你可以从状态表中与id进行比较。它会是这样的。
SELECT * FROM booking_status_history_table bs,booking_table bt
WHERE bs.booking_id=bt.id
and bs.id in
(select max(id) from booking_status_history_table group by booking_id)
答案 2 :(得分:0)
股票解决方案看起来像这样......
SELECT b.*
, x.timestamp
, x.description
, x.status
FROM booking b
JOIN booking_status_history x
ON x.booking_id = b.id
JOIN
( SELECT booking_id,MAX(id) max_id FROM booking_status_history GROUP BY booking_id ) y
ON y.booking_id = x.booking_id
AND y.max_id = x.id;