Where子句仅应用于连接中的一列

问题描述 投票:0回答:4

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

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

由于where子句,查询只返回匹配的记录。我希望得到钱包表中的所有记录,只有那些匹配where子句的余额...希望我解释得很好!

干杯!

sql left-join where-clause
4个回答
1
投票

使用子查询

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

1
投票

问题是你在左连接表钱包上应用过滤器。

使用以下查询。

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

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'

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,则应该从第一个表中选择列。
  • 我猜user_id是一个数字,所以我删除了比较值周围的引号。
  • 表别名使查询更易于编写和读取。
  • 反引号使查询更难写,更难阅读。
© www.soinside.com 2019 - 2024. All rights reserved.