MySQL множественные условия оператора AND - CakePHP - PullRequest
0 голосов
/ 06 мая 2011

Только 2-е из двух утверждений И читает для меня.Я полагаю, что столкнулся с проблемой вложения, но не уверен в этом:

...'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.'МЕЖДУ Age.Min_Age AND Age.Max_age И ТОЛЬКО конкретными записями ГДЕ' PlanDetail.company_id '=> '27 И $ PsSpouseAge.'МЕЖДУ Age.Min_Age AND 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')
            )
        ),

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Ключи массива уникальны, у вас не может быть двух "AND" ключей. Этот случай описан в руководстве , просто оберните их в другой массив:

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 голосов
/ 06 мая 2011

Мне удалось заставить его работать таким образом (и улучшить, добавив второй запрос):

'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))))

Я открыт для любых предложений по оптимизации для этого. Но это единственный способ заставить его работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...