带有活动记录的Code Igniter子查询

问题描述 投票:0回答:2

我正在尝试在 Code Igniter 中执行此查询:

Select 
    items_mtoedifsing.Marca,
    items_mtoedifsing.Modelo,
    items_mtoedifsing.Familia,
    items_movimientos.id_item,
    items_movimientos.Tipo_Movimiento,
    items_movimientos.Fecha_Movimiento,
    items_movimientos.Destino   
from items_movimientos
JOIN items_mtoedifsing ON items_mtoedifsing.id_item=items_movimientos.id_item
where 
        items_movimientos.fecha_movimiento = (Select max(fecha_movimiento) from items_movimientos it where it.id_item=items_movimientos.id_item) 
        and items_movimientos.Destino='value'

但是我在子查询方面遇到了一些问题。这是我的代码,当它应该返回 1 行时,它返回 0 行:

$this->db->select('*');
$this->db->from('items_movimientos');
$this->db->join('items_mtoedifsing', 'items_mtoedifsing.id_item = items_movimientos.id_item');
$this->db->where('items_movimientos.Fecha_Movimiento', '(Select max(fecha_movimiento) from items_movimientos it where it.id_item=items_movimientos.id_item)');
$this->db->where('items_movimientos.Destino', $param);

我可以用这部分做什么:

$this->db->where('items_movimientos.Fecha_Movimiento', '(Select max(fecha_movimiento) from items_movimientos it where it.id_item=items_movimientos.id_item)');
php sql codeigniter subquery
2个回答
1
投票

使用活动记录,您可以通过将第二个参数传递为 null 并将第三个参数传递为 FALSE 来做到这一点。

$subquery="(Select max(fecha_movimiento) 
           from items_movimientos it 
           where it.id_item=items_movimientos.id_item)";
$this->db->where('items_movimientos.Fecha_Movimiento ='.$subquery, null,FALSE);

0
投票

我建议您不要在 WHERE 子句中实现子查询。出于性能原因,请使用 JOIN 访问 MAX() 数据。

public function getMostRecentMovementForDestination(string $destination): ?object
{
    $latestMovement = $this->db
        ->select('item_id, MAX(Movement_Date) max_date')
        ->from('items_movements')
        ->group_by('item_id')
        ->get_compiled_select();

    return $this->db
        ->select('s.Brand, s.Model, s.Family, m.item_id, m.Movement_Type, m.Movement_Date, m.Destination')
        ->join('items_singles s', 's.item_id = m.item_id')
        ->join("($latestMovement) lm", 'm.item_id = lm.item_id AND m.Movement_Date = lm.max_date')
        ->where('m.Destination', $destination)
        ->get('items_movements m')
        ->row();
}

我尝试将您的表和列名称翻译成英文以帮助我理解。

© www.soinside.com 2019 - 2024. All rights reserved.