0

我有一个具有这种结构的表:

id int
min int
max int

我想按升序排列并选择第一行的最大值和第二行的最小值。

所以我做了这个查询,在我得到我需要的值之前:

select min, max
from mytable
order by min asc
limit 2;

我也试过这个:

select cm_max
from mytable
order by cm_min
limit 1
union
select cm_min
from mytable
order by cm_min
limit 1,1;

但不起作用......有什么方法可以只选择我将使用的字段?

4

2 回答 2

1

如果您希望您的值在一行中返回,您可以这样做

SELECT MIN(CASE WHEN rnum = 1 THEN cm_max END) cm_max,
       MIN(CASE WHEN rnum = 2 THEN cm_min END) cm_min
  FROM
(
  SELECT id, cm_min, cm_max, @n := @n + 1 rnum
    FROM medidas, (SELECT @n := 0) n
   ORDER BY cm_min
   LIMIT 2
) q

它的作用是根据您的订单条件获取两条记录,并为内部选择中的每一行分配一个行号。然后在外部选择中,我们使用CASE和行号旋转其值。

或者

SELECT q1.cm_max, q2.cm_min
  FROM
(
  SELECT id, cm_min, cm_max
    FROM medidas
   ORDER BY cm_min
   LIMIT 1
) q1 CROSS JOIN
(
  SELECT id, cm_min, cm_max
    FROM medidas
   ORDER BY cm_min
   LIMIT 1, 1
) q2 

在这个查询中,我们在子查询中抓取两条感兴趣的记录,并CROSS JOIN用于连接两条记录并输出所需的值。

这是两个查询的SQLFiddle演示

于 2013-07-17T23:33:36.980 回答
0

将您的限制更改为 1,1 以仅从该集合中选择第二条记录:

select cm_max as 'value'
from medidas
order by cm_min
limit 1
union
select cm_min as 'value'
from medidas
order by cm_min
limit 1,1;

不确定 MySQL 是否会抱怨字段名称不匹配,因此可能需要也可能不需要别名。

于 2013-07-17T23:22:19.663 回答