2015-05-27 3 views
1

Привет, я застрял над запросом. Я хочу выполнить оператор соединения только тогда, когда условие в выражении if истинно, иначе не выполняйте соединение, а оставшийся запрос выполнить.mysql, если условие выполнено, а затем выполнить соединение иначе

Например, мой запрос, как это:

SELECT `t`.`id`, `t`.`title`, `t`.`date_created`, `t`.`video_id`, `t`.`audio_id`, `t`.`created_by`, `t`.`updated`, `t`.`gamenumber`, `t`.`cat_id`, `t`.`is_deleted`, `t`.`marked_by`, `t`.`is_hidden`, `t`.`battle_type`, `t`.`media` FROM `postdata` `t` 

если t.video_id = '', то запустить присоединиться ЗАЯВЛЕНИЕ

left join processes as pv on (pv.video_id = t.video_id) 

общее КУДА заявление в целом запрос

cat_id IS NOT NULL and is_deleted=0 and is_hidden=0 and battle_type="public" ORDER BY date_created 
!

Оператор WHERE также требует этого условия, если t.video_id! = '' Then

pv.status=3 

В принципе, если в таблице «postdata» содержится поле «video_id», содержащее идентификатор видео. В таблице «процессы» также содержатся эти видеоиды. Поэтому, если postdata.video_id не пуст, выполните команду join, чтобы проверить, содержит ли таблица процессов video_id статус = 3. (если статус = 3, то только выборка видеозаписей) в противном случае, если postdata.video_id пуст, тогда выполните запрос без утверждения объединения и общее предложение Where.

Пожалуйста, помогите.

+0

почему бы не просто положить 'и т. video_id <> '' 'в предикате соединения. вы получите нулевые значения для строк, которые не совпадают. –

+0

Как это связано с Yii? – crafter

+0

@craafter, я упростил запрос в mysql. Я фактически работаю над Yii и использую CDbcriteria для выполнения этого запроса. –

ответ

0

Я думаю, вы должны использовать левое соединение каждый раз, и добавить pv.status=3 присоединиться к условиям, как:

<?php 

$where = [ 
    'is_deleted' => 0, 
    'is_hidden' => 0, 
    'battle_type' => 'public', 
]; 
$postdata = new postdataModel; 
$processes = new processesModel; 
$command = $postdata->getDbConnection()->createCommand() 
    ->select('t.id, t.title, t.date_created, t.video_id, t.audio_id, t.created_by, t.updated, t.gamenumber, t.cat_id, t.is_deleted, t.marked_by, t.is_hidden, t.battle_type, t.media') 
    ->from('postdata AS t') 
    ->leftJoin('processes AS pv', 'pv.video_id = t.video_id AND pv.status = 3') 
    ->where('cat_id IS NOT NULL AND is_deleted = :is_deleted AND is_hidden = :is_hidden AND battle_type = :battle_type') 
    ->order('t.date_created DESC') 
; 
$data = $command->queryAll(); 

и MySQL разрешит все для вас ...

+0

Спасибо, я попробую. –

Смежные вопросы