如何使用没有子查询的列的MAX来过滤SQL查询?

时间:2014-01-24 10:23:13

标签: mysql subquery max aggregate-functions

我有一个类似这样的查询(MySQL):

查询:

SELECT a, b, c, d FROM xTable WHERE d=(
    SELECT MAX(d) FROM xTable WHERE uid=1
) AND c=0

样品:

--xTable--
|  a  |  b  |  c  |  d  | uid |
| 30  | str | 20  | 32  | 1   |
| 36  | abc | 0   | 32  | 1   |
| 20  | ... | 40  | 33  | 1   |
| 19  | dsi | 0   | 34  | 1   |
| 68  |aeasd| 0   | 34  | 1   |
| 112 |3eids| 224 | 34  | 1   |

我只想要d(34)和uid = X最大的行,但只需要c = 0的行。

有没有办法在没有子查询的情况下复制这个查询?

2 个答案:

答案 0 :(得分:0)

它可以重写为JOIN但我不明白为什么会改进任何东西(尽管使用MySQL的有限查询优化器,你永远不会知道......)

SELECT t1.a, 
       t1.b, 
       t1.c, 
       t1.d 
FROM xTable t1
  JOIN (
     SELECT MAX(d) as max_d
     FROM xTable 
     WHERE uid=1
  ) t2 ON t2.max_d = t1.d
WHERE t1.c=0

答案 1 :(得分:0)

我不知道这是否对您有所帮助,但由于您担心因频繁插入而导致更改数据库,您可以尝试下面的解决方案,通过事先选择max来消除获得最大值的动力,并将其用作比较。它将获得您选择触发查询的点所具有的最大行。

with m as (select max(d) as d from xTable ) select a, b, c, d from xTable where d = (select d from m) ;

所以在这里,你的当前查询的最大值是固定的。