我有以下表格 aliados(主表和我尝试从中检索记录的那个)。 aliados_direccion,它将aliados_id作为外键 aliados_centro_medico也将aliados_id作为外键,并使下表中的Many_Many关系成为可能。 centro_medico。
在aliados_direccion和centro_medico中,有一个名为" parroquias_id"的列。它来自一个对此查询不重要的不同表。
我试图让网格向我展示一些" aliados"如果他们有一个aliados_direccion或与他们相关的aliados_centro_medico,其中aliados_direccion.parroquias_id或centro_medico.parroquias_id位于一个依赖于登录用户的数组中。
数组很好,mysql读取没有问题,问题出在实际查询中。
$criteria=new CDbCriteria;
$criteria->select='a.*';
$criteria->alias='a';
$criteria->join='RIGHT JOIN (SELECT dir.* FROM aliados_direccion dir
WHERE dir.parroquias_id IN ('.$zonas.')) ad ON ad.aliados_id=a.id';
$criteria->join='RIGHT JOIN (SELECT many.* FROM aliados_centro_medico many
INNER JOIN (SELECT centro_medico.id as idCM
FROM centro_medico
WHERE centro_medico.parroquias_id
IN ('.$zonas.')) cm
ON cm.idCM = many.centro_medico_id) acm
ON acm.mAlId = a.id';
$criteria->compare(blahblahblah);
//BTW $zonas is the array that I previously built
这里发生的是网格将显示所有记录或不显示任何记录,具体取决于我是使用左连接还是右连接。 我也试过使用关系的别名,比如>
if($this->aliados_direccion){
//First Criteria Join
elseif($this->aliados_centro_medico){
//Second Criteria Join
}
但是当我这样做时,即使我使用INNER JOIN,它仍然会给我带来所有记录。
答案 0 :(得分:1)
您接下来替换了第一次加入。
$criteria->join='RIGHT JOIN (SELECT dir.* FROM aliados_direccion dir
WHERE dir.parroquias_id IN ('.$zonas.')) ad ON ad.aliados_id=a.id';
$criteria->join='RIGHT JOIN (SELECT many.* FROM aliados_centro_medico many
INNER JOIN (SELECT centro_medico.id as idCM
FROM centro_medico
WHERE centro_medico.parroquias_id
IN ('.$zonas.')) cm
ON cm.idCM = many.centro_medico_id) acm
ON acm.mAlId = a.id';
加入是CDbCriteria字段,因此您需要将它们组合起来
$criteria->join='RIGHT JOIN (SELECT dir.* FROM aliados_direccion dir
WHERE dir.parroquias_id IN ('.$zonas.')) ad ON ad.aliados_id=a.id
RIGHT JOIN (SELECT many.* FROM aliados_centro_medico many
INNER JOIN (SELECT centro_medico.id as idCM
FROM centro_medico
WHERE centro_medico.parroquias_id
IN ('.$zonas.')) cm
ON cm.idCM = many.centro_medico_id) acm
ON acm.mAlId = a.id';
答案 1 :(得分:0)
所以,这就是答案...... 我必须创建$ zonas数组,我已经在做一个完成查询的sql语句,就像这样......
$zonas = 'SELECT z.parroquias_id
FROM m_zona_mercadeo z, m_tipo_zona_mercadeo t, m_rrhh r
WHERE r.usuario_id = '.$user->id.'
AND r.tipo_zona_id = t.id AND t.id = z.tipo_zona_id';
查询结果如下:
$criteria=new CDbCriteria;
$criteria->select='a.*';
$criteria->alias='a';
$criteria->join='INNER JOIN (SELECT ad.aliados_id
FROM aliados_direccion ad
WHERE ad.parroquias_id IN ('.$zonas.')
UNION
SELECT acm.aliados_id
FROM aliados_centro_medico acm, centro_medico cm
WHERE cm.id = acm.centro_medico_id
AND cm.parroquias_id IN ('.$zonas.')) u
ON u.aliados_id = a.id';