【问题标题】:Codeigniter - How to select row id's of matching date column in queryCodeigniter - 如何在查询中选择匹配日期列的行 ID
【发布时间】:2019-03-03 20:00:41
【问题描述】:

我正在尝试编写一个将 shiftId 输出到数组中的查询。 我有一张像这样的表。

+---------+----------+-------+
| shiftId | endTime  | shift |
+---------+----------+-------+
|       1 | 03/03/19 |     1 |
|       2 | 03/03/19 |     2 |
|       3 | 03/01/19 |     1 |
|       4 | 03/01/19 |     2 |
+---------+----------+-------+

我想返回每个班次最大的日期的 shiftId,不知道该怎么做。

根据上表,我希望我的数组如下所示。

Array
(
    [0] => 2
    [1] => 4
)

我已尝试按日期分组,然后选择每个班次的最大分组,但不认为我走的是正确的道路。任何帮助将不胜感激。

我想为每个班次 # 最大的日期选择 shiftId。

【问题讨论】:

    标签: php mysql activerecord codeigniter-3


    【解决方案1】:

    在正确的道路上!

    任一种使用(这更清楚地显示了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 和一个破折号连接起来。

    您需要在此处将endTimeMAX(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();
    

    【讨论】:

    • 我想我很快就谈过了。这在这种情况下有效,但不起作用,班次的顺序不同。我实际上是在尝试获取最大 shift 的 shiftId。 $this->db->select('shiftId, MAX(shift)')->group_by('DATE(endTime)')->get('richShift')->result_array();但这会返回错误
    • 用新查询更新了我的帖子,希望这能满足您的需求。 :)
    • 这确实有效,但是,我如何在 sql 中格式化日期?我尝试格式化为 DATE(endTime) 但它返回一个数据库错误。这是我的声明。 $query = $this->db->query('SELECT shiftId FROM richShift WHERE CONCAT(DATE(endTime), "-", shift) IN (SELECT CONCAT(DATE(endTime), "-", MAX(shift)) FROM richShift GROUP BY DATE(endTime))')->result_array();
    • 您的endTime 列使用什么格式?当对endTime 列使用DATE 类型或DATETIME 类型时,您的查询(添加了DATE())对我有用。
    • 我的专栏是 DATETIME。这是错误“SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列 'intranet.richShift.endTime',它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by SELECT shiftId FROM 不兼容richShift WHERE CONCAT(DATE(endTime), "-", shift) IN (SELECT CONCAT(DATE(endTime), "-", MAX(shift)) FROM richShift GROUP BY DATE(endTime))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多