考虑以下两个问题:
SELECT *, 'b' AS b FROM someTable ORDER BY a ASC LIMIT 1;
SELECT *, MAX(a) AS maxA FROM someTable ORDER BY a ASC LIMIT 1;
前一个查询按预期返回值a
的最低行。后一个查询返回存储在磁盘上的第一行(通常是主键值最小的行)。 我该如何解决这个问题呢?我的目的是获取具有最低a
值的列的整行(如果有多个我只需要一个,那没关系哪个),另外我确实需要最高年龄的价值。在一个完美的世界中,我会运行两个查询,但是由于在这个应用程序中对象被序列化的方式,如果不重构很多不是我的代码,我就不能这样做。我实际上不介意MySQL引擎本身是否必须查询两次,重要的是输出是在单行中返回的。遗憾的是,我无法为此查询编写存储过程。是的,*
运算符很重要,我无法列出所需的字段。还有太多的行要归还它们!
请注意,这个问题表面上与a previous question类似,但问的问题是形式不明确和含糊不清,因此所有答案都解决了我不想要的问题(无论多么有用,我确实学到了很多东西我很高兴,事实证明这一点)。这个问题更清楚地询问了预期的问题,因此应该吸引不同的答案。
答案 0 :(得分:4)
为什么不运行它:
SELECT MIN(a) as minA, MAX(a) AS maxA FROM someTable
不幸的是,MySQL不知道窗口函数。因此,如果你真的想选择*
以及最小/最大值,我想你将不得不求助于加入:
SELECT * FROM
(
SELECT * FROM someTable ORDER BY a ASC LIMIT 1
) t1
CROSS JOIN
(
SELECT MIN(a) as minA, MAX(a) AS maxA FROM someTable
) t2
中给出的子选择
答案 1 :(得分:2)
在选择部分中使用子查询:
SELECT *, 'b' AS b,
(SELECT MAX(a) FROM someTable) AS maxA
FROM someTable ORDER BY a ASC LIMIT 1;