Zend_DB_Select - Как написать этот оператор SQL
Доброе утро,
У меня есть некоторые проблемы с Zend Framework и Zend_DB_Select, я хочу использовать этот (рабочий) оператор SQL в качестве оператора выбора Zend DB:
select
oslang
from
oslang, os
where
oslang.oslang_id = os.oslang_id and
ossubversion_id = 1
Я пытался следовать, но это работает:
try {
$select = $this->_db->select()
->from('OSLANG')
->from('OS')
->where("OSLANG.OSLANG_ID = OS.OSLANG_ID")
->where("OSSUBVERSION_ID = ?", $subVersionId);
$results = $select->query()->fetchAll();
} catch (Exception $e) {
$this->_logException($e);
$results = array();
}
должно быть возможно, что с OSLANG_ID связано несколько ОС
У кого-нибудь есть хорошая идея, где моя ошибка?
2 ответа
$select = $this->_db->select()
->from('OSLANG')
->join('OS',"OSLANG.OSLANG_ID = OS.OSLANG_ID")
->where("OSSUBVERSION_ID = ?", $subVersionId);
$results = $select->query()->fetchAll();
SELECT * FROM x, y
равно
SELECT * FROM x CROSS JOIN y
Итак, попробуйте использовать метод joinCross(). Согласно его PHPDoc:
Параметры $name и $cols следуют той же логике, которая описана в методе from().
Это будет что-то вроде этого:
$select = $this->_db->select()
->from('OSLANG')
->joinCross('OS')
->where("OSLANG.OSLANG_ID = OS.OSLANG_ID")
->where("OSSUBVERSION_ID = ?", $subVersionId);
$results = $select->query()->fetchAll();
Обратите внимание, что если вы используете MySQL, CROSS JOIN равен INNER JOIN:
В MySQL CROSS JOIN является синтаксическим эквивалентом INNER JOIN (они могут заменять друг друга). В стандартном SQL они не эквивалентны. ( Справочное руководство по MySQL 5.1:: Синтаксис JOIN)
Разница лишь в том, что:
INNER JOIN используется с предложением ON, CROSS JOIN используется в противном случае
Так что в MySQL вы можете опустить использование ключевых слов INNER или CROSS, синтаксис:
… TableReference [INNER | CROSS] JOIN tableFactor [joinCondition] …