【问题标题】:RIGHT OUTER JOIN doesn't work with WHERE clauseRIGHT OUTER JOIN 不适用于 WHERE 子句
【发布时间】:2014-08-13 15:36:37
【问题描述】:

假设我有两张桌子:

     CREATE TABLE `test_a` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
     `name` varchar(20) DEFAULT NULL,
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

还有

CREATE TABLE `test_b` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `A_id` int(11) NOT NULL,
  `Amount` float NOT NULL,
  `cat` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `test_b_ibfk_1` (`A_id`),
  CONSTRAINT `test_b_ibfk_1` FOREIGN KEY (`A_id`) REFERENCES `test_a` (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

在test_a中我输入了数据

1,A
2、乙
3、C

在第二个表中,我输入了以下数据: 1、1、4.78、1
2、2、77、1
3、1、0.22、1
4、2、13、1

任务是:选择所有金额的总和,按a_id分组,必须出现来自test_a的所有数据。 因此,我使用的是右外连接。 当我运行以下查询时:

SELECT a.name, sum(b.amount)
  FROM test_b AS b RIGHT OUTER JOIN test_a AS a ON b.A_id = a.id
 GROUP BY b.A_id;

这会根据需要提供结果集。像这样: C -- 空
A -- 5
B -- 90

但是当我使用 WHERE 子句时:

          SELECT a.name, sum(b.amount)
          FROM test_b AS b RIGHT OUTER JOIN test_a AS a ON b.A_id = a.id
          **where b.cat =1**
           GROUP BY b.A_id;

我得到结果: A -- 5
B -- 90

我的问题是:如何使用 WHERE 子句达到相同的结果。 (我希望出现“C – null”)

提前致谢!!!

【问题讨论】:

    标签: mysql where-clause outer-join


    【解决方案1】:

    您必须将连接表 b 的条件包含在 ON 条件中:

    SELECT a.name, sum(b.amount) 
    FROM 
        test_b AS b 
    RIGHT OUTER JOIN 
        test_a AS a 
    ON 
        b.A_id = a.id AND b.cat =1 
    GROUP BY b.A_id;
    

    因为如果在 WHERE 子句中使用,它会将 OUTER JOIN 隐式更改为 INNER JOIN。

    【讨论】:

    • 非常感谢,VMai 很有用,我会标记它,但由于我的名声小,无法投票,对不起。
    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 2015-04-27
    • 2011-01-30
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多