我想在第一张表中获取不在第二张表中的行

时间:2019-06-02 12:42:21

标签: php sql laravel

我有一个表,我们称它为fees,另外两个表,我们称它们为transactionsbreakdowns

transactions表保存收到的付款的一般摘要,而breakdowns表保存付款的明细。

分解表看起来像这样

id | transaction_id | fee_id

费用表看起来像这样

id | amount | description

我想根据transaction_id在明细表中没有记录的费用表中获取费用

SELECT * FROM fees LEFT JOIN breakdowns ON (fees.id = breakdowns.fee_id) 
WHERE breakdowns.transaction_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

上面的代码返回空行

2 个答案:

答案 0 :(得分:1)

使用not exists

SELECT f.*
FROM fees f
WHERE NOT EXISTS (SELECT 1
                  FROM breakdowns b
                  WHERE b.fee_id = f.id AND
                        b.transaction_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
                 );

您也可以使用LEFT JOIN,将breakdowns上的条件移至ON子句:

SELECT *
FROM fees f LEFT JOIN
     breakdowns b
     ON b.fee_id = f.id AND  
        b.transaction_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

但是,我认为NOT EXISTS更直接地捕获了您想要的逻辑。另外,我认为没有理由为NULL中的列返回breakdowns值。

答案 1 :(得分:0)

尝试

$data['showrecord'] = DB::table('fees')
           ->where('breakdown.transaction_id',"=",'xxxxx')
           ->leftjoin('breakdown', 'breakdown.fee_id', '=', 'fees.id')
           ->get();