where子句仅适用于联接中的一列

时间:2019-02-21 14:12:27

标签: sql left-join where-clause

我在编写某些SQL查询时遇到了麻烦。我有一个钱包和一个我要加入的余额。查询现在看起来像这样:

SELECT
    `balances`.`id` AS `id`,
FROM
    `wallet` 
LEFT JOIN `balances` ON
    ( `wallet`.`currency` = `balances`.`currency` )
WHERE
    `balances`.`user_id` = '181'

由于where子句,查询返回的只是匹配的记录。我想从钱夹表中获取所有记录,而仅从那些与where子句匹配的余额中获取记录...希望我能解释得足够好!

干杯!

4 个答案:

答案 0 :(得分:1)

使用子查询

SELECT w.*,t.*        
FROM
    wallet w
LEFT JOIN ( select * from balances where user_id = 181
   ) t ON   w.currency =t.currency

答案 1 :(得分:1)

问题是您正在对左联接表钱包应用过滤器。

使用以下查询。

SELECT
    `balances`.`id` AS `id`,
FROM
    `wallet` 
LEFT JOIN (select * from `balances` `user_id` = '181') ON
    ( `wallet`.`currency` = `balances`.`currency` );

答案 2 :(得分:1)

这个问题尚不完全清楚,但是您几乎肯定需要在某种ID上附加一个join子句。现在无法将钱包与其余额配对。假设平衡有。 wallet_id,您将需要以下内容:

SELECT
    `balances`.`id` AS `id`,
FROM
    `wallet` 
LEFT JOIN `balances` ON
    (`wallet`.`id` = `balance`.`wallet_id` )
WHERE
    `balances`.`user_id` = '181'

答案 3 :(得分:0)

将条件移至ON子句。不要使用子查询!

SELECT w.*, b.id
FROM wallet w LEFT JOIN 
     balances b
     ON w.currency = b.currency AND
        b.user_id = 181;

注意:

  • FROM中的子查询会阻碍优化器。
  • 如果您使用的是LEFT JOIN,则应从 first 表中选择列。
  • 我猜user_id是一个数字,所以我删除了比较值周围的引号。
  • 表别名使查询更易于编写和阅读。
  • 反引号使查询更难编写和阅读。