下面是一些代碼,應該工作。 Zend_Db_Select
並沒有真正提供從FROM
子句中的多個表中進行選擇而不使用JOIN
的方式,因此對於查詢的一小部分,這對我來說會感覺有些ha ha。您最好的選擇可能是在適當的情況下使用JOIN
來重寫查詢。
$subselect = $db->select()
->from('geodatas', 'districtCode')
->where('zipCode = clients.zipCode')
->group('zipCode')
->limit(1, 0);
$from = $db->quoteIdentifier('freeAnswers') . ', ' .
$db->quoteIdentifier('clients') . ', ' .
$db->quoteIdentifier('surveys') . ', ' .
$db->quoteIdentifier('customers') . ', ' .
$db->quoteIdentifier('activities');
$select = $db->select()
->from(array('activities' => new Zend_Db_Expr($from)),
array('freeanswers.*',
'districtCode' =>
new Zend_Db_Expr('(' . $subselect . ')'),
'clients.zipCode', 'clients.gender', 'clients.startAge',
'clients.endAge', 'clients.mail', 'clients.facebook',
'clients.customerId', 'clients.activityId',
'surveyName' => 'surveys.name', 'customers.companyName',
'activityName' => 'activities.name'))
->where('freeAnswers.surveyId = surveys.id')
->where('surveys.customerId = customers.id')
->where('activities.id = surveys.activityId')
->where('clients.id = freeAnswers.clientId')
->where('customers.id = ?', 1)
->order('activityName ASC')
->limit(10, 0);
我說這是hackish的唯一原因,是因爲該行的:
->from(array('activities' => new Zend_Db_Expr($from)),
由於from()
真的只用一個表的作品,我創建了一個Zend_Db_Expr
並指定相關的最後一個表名在表達中。如果你沒有通過Zend_Db_Expr
,它會引用不正確的逗號分隔表名,或者如果你傳遞一個表名數組,它只會使用第一個。當你通過一個沒有名字的Zend_Db_Expr
時,它默認使用AS t
,這在你的情況下也不起作用。這就是我爲什麼這樣說的原因。
返回您提供的確切SQL,除了提到的最後一件事情。這實際上是它返回什麼:
SELECT
`freeanswers`.*,
(SELECT `geodatas`.`districtCode`
FROM `geodatas`
WHERE (zipCode = clients.zipCode)
GROUP BY `zipCode`
LIMIT 1) AS `districtCode`,
`clients`.`zipCode`,
`clients`.`gender`,
`clients`.`startAge`,
`clients`.`endAge`,
`clients`.`mail`,
`clients`.`facebook`,
`clients`.`customerId`,
`clients`.`activityId`,
`surveys`.`name` AS `surveyName`,
`customers`.`companyName`,
`activities`.`name` AS `activityName`
FROM `freeAnswers`,
`clients`,
`surveys`,
`customers`,
`activities` AS `activities`
WHERE (freeAnswers.surveyId = surveys.id)
AND (surveys.customerId = customers.id)
AND (activities.id = surveys.activityId)
AND (clients.id = freeAnswers.clientId)
AND (customers.id = 1)
ORDER BY `activityName` ASC
LIMIT 10
所以這將工作,但最終你會想用JOIN
而不是指定大部分WHERE
條款的它可以重寫。
在處理子查詢和Zend_Db_Select
時,我發現在編寫最終查詢之前將每個子查詢編寫爲自己的查詢很簡單,只需將子查詢插入到需要的子查詢中,然後再處理其餘的子查詢。
希望有所幫助。
請重新提示您的查詢;這是不可能讀的。我試圖編輯您的帖子並添加它們,但不允許使用短的編輯。 – Vic 2012-08-04 14:23:46