大家好我想在zend db(zf1.9)上构建这个查询
SELECT `p`.*, `r`.`name` AS `retailer`, `placer`.`name` AS `placer_name`, `placer`.`contact_firstname` AS `placer_firstname`, `placer`.`contact_lastname` AS `placer_lastname`, `placer`.`role_id` AS `placer_role_id`, `editor`.`name` AS `editor_name`, `editor`.`contact_firstname` AS `editor_firstname`, `editor`.`contact_lastname` AS `editor_lastname`, `editor`.`role_id` AS `editor_role_id` FROM `pos` AS `p`
LEFT JOIN `retailers` AS `r` ON r.id = p.retailer_id
LEFT JOIN `members` AS `placer` ON placer.id = p.placer_id
LEFT JOIN `members` AS `editor` ON editor.id = p.editor_id WHERE (p.designer_id=116) AND ((placer.name LIKE '%demo%') OR (placer.contact_firstname LIKE '%demo%') OR (placer.contact_lastname LIKE '%demo%') OR (r.name LIKE '%demo%')) AND (`r`.`name` LIKE '%M%') ORDER BY `p`.`id` asc
我该怎么做?我的问题只是
WHERE (p.designer_id=116) AND ((placer.name LIKE '%demo%') OR (placer.contact_firstname LIKE '%demo%') OR (placer.contact_lastname LIKE '%demo%') OR (r.name LIKE '%demo%')) AND (`r`.`name` LIKE '%M%')
答案 0 :(得分:1)
只需将嵌套的where
- 子句拆分为多个and
- 语句(嵌套or
):
第一
(p.designer_id=116)
第二
((placer.name LIKE '%demo%') OR (placer.contact_firstname LIKE '%demo%') OR (placer.contact_lastname LIKE '%demo%') OR (r.name LIKE '%demo%'))
第三
(`r`.`name` LIKE '%M%')
在ZEND中,每个AND
都是一个单独的where
- 条款,可能看起来像这样(未经测试!仅为了更好的理解!):
->where("p.designer_id=116");
->where("(placer.name LIKE ?)
OR (placer.contact_firstname LIKE ?)
OR (placer.contact_lastname LIKE ?)
OR (r.name LIKE ?)", '%demo%', '%demo%', '%demo%', '%demo%');
->where("r.name LIKE ?", '%M%');
(注意:我添加了手动换行符以提高可读性)
答案 1 :(得分:1)
我认为以下情况更好。 NEST将打开支架UNNEST将关闭支架
$where = new Sql\Where();
$where->NEST//start braket
->equalTo('col','someVal')
->OR
->equalTo('col','secondVal')
->UNNEST; //close bracet
这将产生WHRE(col = someVal OR col = secondVal) 还记得终止后(put;)如果NEST已经存在,它将自动添加NUNEST 例如 我认为追随更好。 NEST将打开支架UNNEST将关闭支架
$where = new Sql\Where();
$where->NEST//start braket
->equalTo('col','someVal')
->OR
->equalTo('col','secondVal');
$where->OR;
$where->NEST//start braket
->equalTo('col','someVal1')
->OR
->equalTo('col','secondVal2');
这将产生WHRE(col = someVal OR col = secondVal)OR(col = someVal2 OR col = secondVal2)