2012-08-04 39 views
0

我有這樣的MySQL查詢:如何與選擇翻譯很長的MySQL查詢,並加入到Zend Framework的1.11模型

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使用它框架1.11模型 我得到這個錯誤:Mysqli準備錯誤:操作數應該包含1列

請問,任何人都可以幫助我使它運行良好?

最好的問候, Elaidon

+0

請重新提示您的查詢;這是不可能讀的。我試圖編輯您的帖子並添加它們,但不允許使用短的編輯。 – Vic 2012-08-04 14:23:46

回答

0

下面是一些代碼,應該工作。 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時,我發現在編寫最終查詢之前將每個子查詢編寫爲自己的查詢很簡單,只需將子查詢插入到需要的子查詢中,然後再處理其餘的子查詢。

希望有所幫助。

+0

嗨Drew010!首先謝謝你的回答,但我有一個問題。我在模型中,並用$ this替換了您示例中的所有$ db變量,但調試器出現此錯誤:致命錯誤:調用未定義的方法Admin_Model_Suggestions :: quoteIdentifier(),我不知道爲什麼。 – Elaidon 2012-08-06 06:57:56

+0

從模型中,您將不得不獲得具有'getAdapter()'方法的'DbTable'對象的實例,該方法將返回可以調用'quoteIdentifier'的DB適配器。如果您遵循模型和映射器的ZF快速入門方法,它將看起來像'$ this-> getDbTable() - > getAdapter() - > quoteIdentifier(...);'這取決於您的模型如何設置。 – drew010 2012-08-06 15:39:46