2015-05-27 46 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) 

共同WHERE語句在整個查詢

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!=''那麼

pv.status=3 

基本上,如果'postdata'表中包含字段'video_id',其中包含視頻的id。 '進程'表也包含這些video_id。因此,如果postdata.video_id不爲空,那麼執行join語句來檢查video_id是否爲進程表包含status = 3。 (如果狀態= 3,則只能獲取視頻記錄),否則如果postdata.video_id爲空,則執行沒有加入語句和普通Where語句的查詢。

請幫忙。

+0

爲什麼不乾脆把'和T。 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

謝謝,我會試試看。 –

相關問題