2013-07-17 1 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 IMHO Самый простой способ - просто получить две записи с «ORDER BY cm_min» и «LIMIT 2» и получить необходимые значения столбца в клиентском коде при обходе вашего набора результатов. Но если вы хотите, чтобы ваши значения возвращались в код клиента в одну строку, вам необходимо использовать один из вышеупомянутых методов. – peterm

0

Изменить лимит на 1,1, чтобы выбрать только 2-ю запись из этого набора:

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