動作するはずのコードを次に示します。 を使用せずに句内Zend_Db_Select
の複数のテーブルから選択する方法を実際に提供していないため、クエリの小さな部分に関して、これは少しハックな気がします。おそらく最善の策は、適切な場所で s を使用してクエリを書き直すことです。FROM
JOIN
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);
ハックだと私が言う唯一の理由は、次の行のためです。
->from(array('activities' => new Zend_Db_Expr($from)),
from()
実際には 1 つのテーブルでしか機能しないため、 を作成し、Zend_Db_Expr
相関関係を式の最後のテーブル名として指定します。を渡さないZend_Db_Expr
と、コンマ区切りのテーブル名が誤って引用されるか、テーブル名の配列を渡すと、最初のものだけが使用されます。名前のないa を渡す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
、最終的なクエリを記述する前に、各サブクエリを独自のクエリとして記述し、必要な場所にサブクエリを挿入しZend_Db
て残りを処理するのは簡単だと思います。
それが役立つことを願っています。