2011-05-05 107 views
0

只有兩個AND語句中的第二個正在爲我讀取。我相信,我遇到了一個嵌套的問題,但在這一點不知道:MySQL多個AND語句條件 - CakePHP

...'conditions' => array(
      "AND" => array(
       array($ApplicantAge . ' BETWEEN Age.Min_Age AND Age.Max_age'), 
       'Zips.title'  => $Zip, 
       'Applicant.amount' => array($comboType, $memberCount) 
      ), 
      "AND" => array(
       array($PsSpouseAge . ' BETWEEN Age.Min_Age AND Age.Max_age'), 
       'PlanDetail.company_id' => '27', 
       'Zips.title'   => $Zip, 
       'Applicant.amount'  => array($comboType, $memberCount) 
      ) 
     ),... 

正如你可以看到,我試圖讓所有的記錄$ ApplicantAge。 'BETWEEN Age.Min_Age AND Age.Max_age AND ONLY特定記錄'PlanDetail.company_id'=> '27 AND $ PsSpouseAge。 '之間Age.Min_Age和Age.Max_age'), ...

這裏是我的SQL輸出:

WHERE ((18 BETWEEN `Age`.`Min_Age` AND `Age`.`Max_age`) OR (`Zips`.`title` = '98605') OR (`Applicant`.`amount` IN ('as', '2'))) AND ((24 BETWEEN `Age`.`Min_Age` AND `Age`.`Max_age`) AND (`PlanDetail`.`company_id` = 27) AND (`Zips`.`title` = '97378') AND (`Applicant`.`amount` IN ('as', '2'))) 

因爲它的立場,在'PlanDetail.company_id'=> '27'被重寫並且只有滿足該「PlanDetail.company_id」的結果=>「27」標準表示

我已經在這一段時間,所以它的所有的起始於眼睛視圖混搭。感謝您注意我的SQL邏輯的任何問題。

這裏是我的全部連接和條件現在:

$options = array(
     'joins'  => array(
      array(
       'table'  => 'plans_zips', 
       'alias'  => 'PZips', 
       'type'  => 'inner', 
       'foreignKey' => false, 
       'conditions' => array('Plan.id = PZips.plan_id') 
      ), 
      array(
       'table'  => 'zips', 
       'alias'  => 'Zips', 
       'type'  => 'inner', 
       'foreignKey' => false, 
       'conditions' => array('Zips.id = PZips.zip_id') 
      ) 
     ), 
     'conditions' => array(
      'OR' => array(
       'AND' => array(
        array($ApplicantAge . ' BETWEEN Age.Min_Age AND Age.Max_age'), 
        'Zips.title'  => $Zip, 
        'Applicant.amount' => array($comboType, $memberCount), 
        'NOT'    => array(
         'PlanDetail.company_id' => 27 
        ) 
       ), 
       array($PsSpouseAge . ' BETWEEN Age.Min_Age AND Age.Max_age') 
      ) 
     ), 

回答

0

我能得到它以這種方式工作(並通過添加第二個查詢來增強):

'conditions' => array(
      "OR" => array(
       'AND' => array(
        $ApplicantAge . ' BETWEEN Age.Min_Age AND Age.Max_age', 
        'Zips.title'    => $Zip, 
        'Applicant.amount'   => array($comboType, $memberCount), 
       "NOT" => 
        array(array('PlanDetail.company_id' => array('27','3')))), 
       array(
        $PsSpouseAge . ' BETWEEN Age.Min_Age AND Age.Max_age', 
        'Zips.title'   => $Zip, 
        'Applicant.amount'  => array($comboType, $memberCount), 
        'PlanDetail.company_id' => '27'), 
       array(
        $OdsSpouseAge . ' BETWEEN Age.Min_Age AND Age.Max_age', 
        'Zips.title'   => $Zip, 
        'Applicant.amount'  => array($comboType, $memberCount), 
        'PlanDetail.company_id' => '3')) 
    ), 

得到的SQL是:

WHERE 
((((18 BETWEEN `Age`.`Min_Age` AND 
`Age`.`Max_age`) AND 
(`Zips`.`title` = '98258') AND 
(`Applicant`.`amount` IN ('as', '2')) AND 
(NOT (`PlanDetail`.`company_id` IN (27, 3))))) 
OR 
(((50 BETWEEN `Age`.`Min_Age` AND 
`Age`.`Max_age`) AND 
(`Zips`.`title` = '98258') AND 
(`Applicant`.`amount` IN ('as', '2')) AND 
(`PlanDetail`.`company_id` = 27))) 
OR 
(((50 BETWEEN `Age`.`Min_Age`AND 
`Age`.`Max_age`) AND 
(`Zips`.`title` = '98258') AND 
(`Applicant`.`amount` IN ('as', '2')) AND 
(`PlanDetail`.`company_id` = 3)))) 

我願意接受任何建議優化的想法這一點。但這是我能夠正常工作的唯一途徑。

3

數組鍵是獨一無二的,你不能有兩個"AND"鍵。這種情況是covered in the manual,只是包裝他們在另一個數組:

array(
    array('and' => array(…)), 
    array('and' => array(…)) 
) 

由於條件默認爲AND儘管你可以離開它完全。 (a AND b AND c) AND (d AND e AND f)a AND b AND c AND d AND e AND f相同。

看起來像你對我張貼的條件可以簡化爲這樣:

'conditions' => array(
    'Zips.title'   => $Zip, 
    'Applicant.amount'  => array($comboType, $memberCount), 
    'PlanDetail.company_id' => 27, 
    "$ApplicantAge BETWEEN Age.Min_Age AND Age.Max_age", 
    "$PsSpouseAge BETWEEN Age.Min_Age AND Age.Max_age" 
) 

顯然,你想是這樣的,雖然:

'conditions' => array(
    'or' => array(
     'and' => array(
      "$ApplicantAge BETWEEN Age.Min_Age AND Age.Max_age", 
      'Zips.title'  => $Zip, 
      'Applicant.amount' => array($comboType, $memberCount), 
      'not' => array(
       'PlanDetail.company_id' => 27 
      ) 
     ), 
     "$PsSpouseAge BETWEEN Age.Min_Age AND Age.Max_age" 
    ) 
) 
+0

我仍在試驗這個,但這是需要發生的事情的細分:1.獲取所有記錄(除了那些'PlanDetail.company_id'之外的所有記錄(WHERE $ ApplicantAge。'BETWEEN Age.Min_Age AND Age.Max_age') =>'27',然後添加記錄數組($ PsSpouseAge。'BETWEEN Age.Min_Age AND Age.Max_age')。你看到有兩個年齡變量。 – OldWest 2011-05-06 01:02:29

+0

@Old所以所有記錄*(年齡介於x - y **而非**公司= 27)或(年齡在x - y之間)*? – deceze 2011-05-06 01:20:01

+0

@Dec,是的。你理解正確。我正在嘗試OR運算符,但我無法獲得AND和OR一起工作。 – OldWest 2011-05-06 01:25:01