你是在正确的道路上!
任一种使用(这更清楚地显示了SQL):
$query = $this->db->query('SELECT max(shiftId) shiftId FROM yourtable GROUP BY endTime')->result_array();
或者(如果你想使用 CI 的查询生成器):
$query = $this->db->select_max('shiftId')->group_by('endTime')->get('yourtable')->result_array();
这两个都按endTime 对表进行分组,然后为每组相同的endTimes 返回最大shiftId。两者都给出了一个如下所示的数组:
Array
(
[0] => Array
(
[shiftId] => 2
)
[1] => Array
(
[shiftId] => 4
)
)
要删除结果中的shiftId 索引并从您的 OP 中获取确切的数组结构,请使用:
array_column($query, 'shiftId');
编辑
如果您想为每个endTime + MAX(shift) 组合获取shiftId,请使用:
SELECT shiftId FROM yourtable
WHERE CONCAT(endTime, "-", shift) IN (
SELECT CONCAT(endTime, "-", MAX(shift)) FROM yourtable GROUP BY endTime
)
内部查询(在IN 之后)与前一个查询大致相同:它按endTime 对表中的记录进行分组,然后为每组相同的endTime 获取最大shift s,在这里它与endTime 和一个破折号连接起来。
您需要在此处将endTime 与MAX(shift) 连接起来,因为MAX(shift) 在表中并不是唯一的(例如,编号为2 的班次不止一个),endTime 也不是。
外部查询 (SELECT shiftId...) 然后为每个 endTime + MAX(shift) 组合找到匹配的 shiftId 并返回。
您需要为此使用两个(嵌套)查询,因为内部查询使用分组而外部查询不使用,并且不允许在一个查询中混合使用这两种类型。
注意:CONCAT 仅适用于 MySQL,如果您使用不同的数据库类型,您可能需要查看它使用的连接语法(例如可以是 + 或 ||)。
在 CI 中:
$query = $this->db->query('SELECT shiftId FROM yourtable
WHERE CONCAT(endTime, "-", shift) IN (SELECT CONCAT(endTime, "-", MAX(shift)) FROM yourtable GROUP BY endTime)')->result_array();