如何使用 codeigniter 对连接查询进行区分或仅省略重复项
How do I do a distinct on a join query using codeigniter or just to omitt duplicates
我有这段代码可以输出重复的行,但是当我在数据库中单独查找它们时,只出现 3 行,但是当我使用连接时,其中 6 行出现,其中 3 行重复。我如何避免这种情况或如何省略重复项。
<?php
class Joins_model extends CI_Model{
private $table = 'cm_proveedor, cm_compras, cm_valuacion, cm_valuacionr, cm_nomina, cm_empleado';
function _construct(){
parent::Model();
}
function get_reg($data){
$this->db->distinct();
$this->db->select('
cm_proveedor.nombre,
cm_valuacion.mano_obra,
cm_valuacion.refaccion,
cm_valuacionr.refaccion,
cm_valuacion.costoHojalateria,
cm_valuacion.costoPintura,
cm_valuacion.costoMecanica,
cm_valuacion.pv_hojalateria,
cm_valuacion.pv_pintura,
cm_valuacion.pv_mecanica,
cm_valuacion.pc_hojalateria,
cm_valuacion.pc_pintura,
cm_valuacion.pc_mecanica,
cm_valuacion.tipo,
cm_valuacion.hojalateria,
cm_valuacion.pintura,
cm_valuacion.mecanica,
cm_valuacion.tipo_r,
cm_empleado.nombre,
cm_compras.precio
');
$this->db->from('cm_proveedor');
$this->db->join('cm_compras','cm_proveedor.id = cm_compras.id_proveedor');
$this->db->join('cm_valuacion','cm_compras.id_siniestro = cm_valuacion.id_siniestro');
$this->db->join('cm_valuacionr','cm_valuacion.id_siniestro = cm_valuacionr.id_siniestro');
$this->db->join('cm_nomina','cm_valuacionr.id_siniestro = cm_nomina.id_siniestro');
$this->db->join('cm_empleado','cm_nomina.id_empleado = cm_empleado.id');
$this->db->where('cm_valuacion.id_siniestro',$data);
//$this->db->order_by('id','asc');
return $this->db->get($table);
}
}
?>
当前输出:
name mano_obra cH cP cM mecanica tipo_r empleado precio nomina refaccion refaccion1
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 1850.00 89.00 REDIADOR REDIADOR
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 150.00 89.00 REDIADOR REDIADOR
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 1850.00 89.00 REDIADOR RADIADOR
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 150.00 89.00 REDIADOR RADIADOR
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 1850.00 89.00 REDIADOR ANTICONGELANTE
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 150.00 89.00 REDIADOR ANTICONGELANTE
似乎有额外的数据从您的加入中带来,导致形成重复。
我认为您需要在调用结束时添加一个 GROUP BY
可能:
$this->db->group_by('refaccion1');
基本上您希望从数据集中删除什么?
在这种情况下,DISTINCT 本身不会做太多事情。
基本上,如果您省略了 select 语句.. 某些结果中会出现不同的数据,从而导致 'duplicates'。直接在 SQL 查询中尝试 运行 查询并查看结果。
我也建议放弃
private $table = 'cm_proveedor, cm_compras, cm_valuacion, cm_valuacionr, cm_nomina, cm_empleado';
并更改您的模型:
return $this->db->get($table);
到
return $this->db->get();
您使用的方法基本上是将每个列连接两次,FROM 与多个表是执行 JOIN 的旧折旧方法。有效地连接你的表两次,这会损害性能,完全没有必要。
进一步参考:SQL left join vs multiple tables on FROM line?
我有这段代码可以输出重复的行,但是当我在数据库中单独查找它们时,只出现 3 行,但是当我使用连接时,其中 6 行出现,其中 3 行重复。我如何避免这种情况或如何省略重复项。
<?php
class Joins_model extends CI_Model{
private $table = 'cm_proveedor, cm_compras, cm_valuacion, cm_valuacionr, cm_nomina, cm_empleado';
function _construct(){
parent::Model();
}
function get_reg($data){
$this->db->distinct();
$this->db->select('
cm_proveedor.nombre,
cm_valuacion.mano_obra,
cm_valuacion.refaccion,
cm_valuacionr.refaccion,
cm_valuacion.costoHojalateria,
cm_valuacion.costoPintura,
cm_valuacion.costoMecanica,
cm_valuacion.pv_hojalateria,
cm_valuacion.pv_pintura,
cm_valuacion.pv_mecanica,
cm_valuacion.pc_hojalateria,
cm_valuacion.pc_pintura,
cm_valuacion.pc_mecanica,
cm_valuacion.tipo,
cm_valuacion.hojalateria,
cm_valuacion.pintura,
cm_valuacion.mecanica,
cm_valuacion.tipo_r,
cm_empleado.nombre,
cm_compras.precio
');
$this->db->from('cm_proveedor');
$this->db->join('cm_compras','cm_proveedor.id = cm_compras.id_proveedor');
$this->db->join('cm_valuacion','cm_compras.id_siniestro = cm_valuacion.id_siniestro');
$this->db->join('cm_valuacionr','cm_valuacion.id_siniestro = cm_valuacionr.id_siniestro');
$this->db->join('cm_nomina','cm_valuacionr.id_siniestro = cm_nomina.id_siniestro');
$this->db->join('cm_empleado','cm_nomina.id_empleado = cm_empleado.id');
$this->db->where('cm_valuacion.id_siniestro',$data);
//$this->db->order_by('id','asc');
return $this->db->get($table);
}
}
?>
当前输出:
name mano_obra cH cP cM mecanica tipo_r empleado precio nomina refaccion refaccion1
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 1850.00 89.00 REDIADOR REDIADOR
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 150.00 89.00 REDIADOR REDIADOR
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 1850.00 89.00 REDIADOR RADIADOR
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 150.00 89.00 REDIADOR RADIADOR
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 1850.00 89.00 REDIADOR ANTICONGELANTE
MyStore CAMBIO DE RADIADOR 0 0 0 250 0 DAVID 150.00 89.00 REDIADOR ANTICONGELANTE
似乎有额外的数据从您的加入中带来,导致形成重复。
我认为您需要在调用结束时添加一个 GROUP BY
可能:
$this->db->group_by('refaccion1');
基本上您希望从数据集中删除什么? 在这种情况下,DISTINCT 本身不会做太多事情。
基本上,如果您省略了 select 语句.. 某些结果中会出现不同的数据,从而导致 'duplicates'。直接在 SQL 查询中尝试 运行 查询并查看结果。
我也建议放弃
private $table = 'cm_proveedor, cm_compras, cm_valuacion, cm_valuacionr, cm_nomina, cm_empleado';
并更改您的模型:
return $this->db->get($table);
到
return $this->db->get();
您使用的方法基本上是将每个列连接两次,FROM 与多个表是执行 JOIN 的旧折旧方法。有效地连接你的表两次,这会损害性能,完全没有必要。
进一步参考:SQL left join vs multiple tables on FROM line?