簡體   English   中英

mysql如果滿足條件,則執行join,否​​則不執行

[英]mysql if condition met then execute join otherwise not

嗨,我陷入了一個查詢。 我只想在if語句為true的條件下執行join語句,否則不要執行join並讓其余的查詢執行。

例如,我的查詢是這樣的:

 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!=''然后運行join語句

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 

如果t.video_id!=''則WHERE語句也需要此條件

pv.status=3

基本上,如果“ postdata”表包含字段“ video_id”,其中包含視頻的ID。 並且“進程”表也包含這些video_id。 因此,如果postdata.video_id不為空,則執行join語句以檢查video_id是否為進程表中包含status = 3的表。 (如果status = 3僅獲取視頻記錄),否則,如果postdata.video_id為空,則在不使用join語句和通用Where語句的情況下執行查詢。

請幫忙。

我認為您應該每次使用左連接並添加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將為您解決所有問題...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM