Запись подзапроса с использованием Zend DB
У меня возникли проблемы с преобразованием SQL ниже в запрос Zend Db.
$select = ' SELECT s.id, i.id as instance_id, i.reference, i.name, i.sic_code, i.start_date
FROM sles s
JOIN sle_instances i
ON s.id = i.sle_id
WHERE i.id = ( SELECT MAX(id)
FROM sle_instances
WHERE sle_id = s.id
)
ORDER BY i.name ASC';
Я добрался до кода раньше, но Zend Db неправильно обрабатывает запрос. Может ли кто-нибудь показать мне то, что я пропустил?
$select = $db->select() ->from('sles', array( 'id',
'instance_id' => 'sle_instances.id',
'reference' => 'sle_instances.reference',
'name' => 'sle_instances.name',
'sic_code' => 'sle_instances.sic_code',
'start_date' => 'sle_instances.start_date'
)
)
->join('sle_instances', 'sles.id = sle_instances.sle_id')
->where('sles.id = (SELECT MAX(id) FROM sle_instances WHERE sle_id = sles.id)')
->order('sle_instances.name ASC');
SQL работает, кстати. Я переписываю его с помощью Zend Db, поскольку я хочу использовать функциональность Zend Paginator.
Любая помощь очень ценится.
PJ
Ответы
Ответ 1
Это:
$select = $db->select()->from(array("s" => "sles"), array("s.id","i.id as instanceid","i.reference","i.name","i.sic_code","i.start_date"))
->join(array('i' => "sle_instances"),"s.id = i.sle_id",array())
->where("i.id = (select max(id) from sle_instances where sle_id = s.id)")
->order('i.name asc');
Дает следующее:
"SELECT `s`.`id`, `i`.`id` AS `instanceid`, `i`.`reference`, `i`.`name`, `i`.`sic_code`, `i`.`start_date` FROM `sles` AS `s`
INNER JOIN `sle_instances` AS `i` ON s.id = i.sle_id WHERE (i.id = (select max(id) from sle_instances where sle_id = s.id)) ORDER BY `i`.`name` asc"
Ответ 2
если вы хотите, вы можете взять то, что сделал @karim79, и включить ваш подзадач в $this- > select(), а также...
$subselect = $db->select()
->from('sle_instances', array(new Zend_Db_Expr('max(id)')))
->where('sle_id = s.id');
$select = $db->select()->from(array("s" => "sles"),
array("s.id","i.id as instanceid","i.reference","i.name","i.sic_code","i.start_date"))
->join(array('i' => "sle_instances"),"s.id = i.sle_id",array())
->where("i.id = ($subselect)")
->order('i.name asc');
print($select);
//SELECT `s`.`id`, `i`.`id` AS `instanceid`, `i`.`reference`, `i`.`name`, `i`.`sic_code`, `i`.`start_date` FROM `sles` AS `s` INNER JOIN `sle_instances` AS `i` ON s.id = i.sle_id WHERE (i.id = (SELECT max(id) FROM `sle_instances` WHERE (sle_id = s.id))) ORDER BY `i`.`name` asc
Ответ 3
У меня была очень похожая проблема, и я обнаружил, что этот запрос можно легко записать следующим образом:
$select = $db->select()
->from (
array("s" => "sles"),
array(
"s.id",
"instanceid" => "i.id",
"i.reference",
"i.name",
"i.sic_code",
"i.start_date")
)
->join(
array('i' => "sle_instances"),
"s.id = i.sle_id",
array()
)
->where ("i.id = (" .
$db->select()
->from('sle_instances', array(new Zend_Db_Expr('max(id)')))
->where('sle_id = s.id');
.")")
->order('i.name asc');
print($select);
Это точно так же, как уже сказано здесь. Но я чувствовал, что это немного легче читать, поскольку зависимости между запросами более очевидны.
Ответ 4
Отличный вопрос! Спасибо вам за это. Также хотелось выбросить, что если вы пытаетесь сделать группу после заказа, вы также можете использовать этот синтаксис с помощью чего-то очень похожего на следующие
$subquery = $this->_datawarehouse->select()
->from('revenueLog')
->where('Date '.$ReturnDate)
->order('Date DESC');
$this->view->end = microtime();
$format = new Zend_Db_Expr('DATE_FORMAT(`Date`,"%d-%m-%y")');
$select = $this->_datawarehouse->select()
->from(array('subquery'=>$subquery))
->group('Client')
->group($format)
->order('Vertical ASC')
->order('Revenue DESC');
echo $select->__ToString();
$stmt = $this->_datawarehouse->query($select);
$data = $stmt->fetchAll();
для любого, кто задается вопросом. $ReturnDate - это строка, основанная на пользовательском вводе, которая обычно заканчивается как "МЕЖДУНАРОДНАЯ дата1" и "дата2"