0

私はこのmysqlクエリを持っています:

SELECT 
    freeAnswers.*, 
    (SELECT `districtCode` 
         FROM `geodatas` 
         WHERE `zipCode` = clients.zipCode 
         GROUP BY `zipCode` 
         LIMIT 0, 1) as districtCode, 
    clients.zipCode, 
    clients.gender, 
    clients.startAge, 
    clients.endAge, 
    clients.mail, 
    clients.facebook, 
    surveys.customerId, 
    surveys.activityId, 
    surveys.name as surveyName, 
    customers.companyName, 
    activities.name as activityName 
    FROM freeAnswers, 
         clients, 
         surveys, 
         customers, 
         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 0, 10

私のmysqlサーバーではクエリは正しいですが、Zend Framework 1.11モデルでそれを使用しようとすると、次のエラーが発生します:Mysqli prepare error: Operand should contain 1 column(s)

誰かがそれをうまく実行するのを手伝ってくれませんか?

よろしく、 エライドン

4

1 に答える 1

0

動作するはずのコードを次に示します。 を使用せずに句内Zend_Db_Selectの複数のテーブルから選択する方法を実際に提供していないため、クエリの小さな部分に関して、これは少しハックな気がします。おそらく最善の策は、適切な場所で s を使用してクエリを書き直すことです。FROMJOINJOIN

    $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て残りを処理するのは簡単だと思います。

それが役立つことを願っています。

于 2012-08-04T18:44:15.307 に答える