2013-07-17 31 views
0

我有一个表,这个结构:如何选择不同行的两个字段?

id int 
min int 
max int 

我想ascendently订购并选择第一行的最大,而第二个的分。

所以我做了这个查询,之前,我的价值观,我需要:

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; 

但不工作... 有任何方法来只选择我将使用的字段?

+1

一些样本数据和期望的输出可能有助于在这里。 –

回答

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演示了两个询问

+0

有没有更简单的方法?你能解释一下代码吗?谢谢。 – harrison4

+0

@Marco查看有关机器人查询解释的更新答案。 – peterm

+1

@Marco恕我直言,最简单的方法是用'ORDER BY cm_min'和'LIMIT 2'获取两条记录,并在遍历结果集时在客户端代码中获取必要的列值。但是,如果您希望将您的值返回到一行中的客户端代码,那么您需要使用上述技术之一。 – peterm

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会抱怨误匹配字段名,所以可能会或可能不会需要别名。

+0

使用你的方法:'#1221 - 不正确的使用UNION和ORDER BY' – harrison4

相关问题