PHP和MySQL在MAX列上执行连接

时间:2015-02-02 05:10:51

标签: php mysql sql mysqli

我已经在这里阅读了一些相似的主题,经过几个小时的敲击,我仍然无法让它工作。

我在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点,我整晚都在忙着拥有一个巨大的代码块。

谢谢!

3 个答案:

答案 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;