我有一个复杂的SELECT查询,它返回如下信息:
+------+-------+--------+
| a | b | c |
+------+-------+--------+
| 2482 | 3681 | 58248 |
| 2482 | 17727 | 139249 |
| 2482 | 23349 | 170839 |
| 3031 | 14877 | 122921 |
| 3031 | 20691 | 156457 |
| 3031 | 20932 | 157784 |
+------+-------+--------+
我正试图找出如何为每个a值返回最大值为b的行。 here中的解决方案看起来很有前途,但我无法使其工作,因为我的起点不是表而是查询(或视图,我猜),我收到错误
“ERROR 1146(42S02):表'databasename.s'不存在”
当我尝试以上述问题的方式引用子查询时:
select s.* from (SELECT blah blah complex) s where s.b = (select max(s2.b) from s s2 where s2.a = s.a);
我很确定这是一个半繁琐的问题,但我已经把它搁浅了好几个小时,根本不理解它足以导航我的方式......
编辑:我应该澄清我想要输出的内容:
+------+-------+--------+
| a | b | c |
+------+-------+--------+
| 2482 | 23349 | 170839 |
| 3031 | 20932 | 157784 |
+------+-------+--------+
MySQL版本是5.5.49(Ver 14.14 Distrib 5.5.49)
更新:@Harshil的回答澄清了我的尝试基本上是不可能的,所以我最终遵循其他问题的指导(由@Bill Karwin的提交指导)并重写我的原始查询以执行另一个JOIN(针对子查询)这是max()。
答案 0 :(得分:0)
select a,b,c from examp where (a,b) in (select a ,max(b) from examp group by a );
答案 1 :(得分:0)
别名s
在子查询中无法显示。所以你必须在子查询中再次编写它。也可以使用group by
代替where
子句,如下所示:
select s.*
from
(SELECT blah blah complex) s
where (s.a,s.b) in (select s2.a,max(s2.b) from (SELECT blah blah complex) group by s2.a);
或者,创建查询(SELECT blah blah complex)
的查看,即名为 V
并在主查询中使用它,如下所示:
select *
from V
where (a,b) in (select v2.a,max(v2.b) from V as v2 group by v2.a);
希望它有所帮助!
答案 2 :(得分:-1)
首先,使用
SELECT * INTO newTableName
FROM yourRules
将查询保存到新表。
然后我们可以从新表中做另一个选择。
SELECT *
FROM newTableName t1
WHERE b = (
SELECT max(b)
FROM newTableName t2
WHERE t1.a = t2.a
)