Выбор уникальных минимальных значений.

wargasm

Новичок
Выбор уникальных минимальных значений.

Собственно задача наверно совсем простая, но я с ней справиться не могу =\

Сабж: есть таблица с тремя колонками (f1, f2, f3).
Нужно составить такой запрос, который выберет уникальные значения первой колонки, минимальное числовое значение второй и соответсвующее данному ряду значение третей колонки.

Например таблица:
A 2 X
A 1 Y
B 3 Z
B 1 Q

Нужно получить:
A 1 Y
B 1 Q

Пробовал такой запрос:
SELECT DISTINCT(f1), MIN(f2), f3 FROM table GROUP BY f1

Но получаеться ерунда. значение третего поля не соответсвует ряду =( и выбирает из таблицы:
A 1 X
B 1 Z

Т.е. получаеться что таким запросом из третего поля выбираеться первый ряд где встречаеться А или B. Может нужно делать два отдельных запроса? Или какое условие нужно?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Какой-то странный у тебя запрос.
Ты мануал читать пробовал?
 

wargasm

Новичок
В поиске не нашел ответа. Ну два поля выбираються правильно, подскажите как с третим быть?
 

crocodile2u

http://vbolshov.org.ru
wargasm
Ищи дальше. Уже тепло. Наводка: разберись, что делает груп-бай и что делает дистинкт.
 

wargasm

Новичок
Уже мозги болят искать =\. Не 1 час я уже пробовал варианты и искал по форумам. Трудно подсказать? На примере понять гораздо проще.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума

Bitterman

Новичок
wargasm
Объясни конкретнее, чего ты хочешь. Минимальное значение не может быть неуникальным, оно всего одно.
 

wargasm

Новичок
Хочу из таблицы
A | 2 | X
A | 1 | Y

получить A1Y а получаеться A1X потому что из третего столбика выбираеться не то значение где минимален второй столбик, а значение в первой строке с А =(
 

wargasm

Новичок
Знаком. Только что сортировать? Если сортировать последний столбик, то будет работать до первого появления "B" значения в таблице.. пздц.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
wargasm
Патамушто гладиолус.
Пожалуйста, в студию.
1. SHOW CREATE TABLE
2. Дамп данных
3. Запрос.
 

wargasm

Новичок
Таблица:
[SQL]
CREATE TABLE `table` (
`name` varchar(32) character set utf8 collate utf8_bin NOT NULL default '',
`time` int(10) unsigned NOT NULL default '0',
`cp` int(10) unsigned NOT NULL default '0',
`gc` int(10) unsigned NOT NULL default '0',
`map` varchar(32) character set utf8 collate utf8_bin NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
[/SQL]
Данные:
[SQL]
INSERT INTO `table` (`name`, `time`, `cp`, `gc`, `map`) VALUES ('t00rch1k', 301, 84, 64, 'dr0_cliffside');
INSERT INTO `table` (`name`, `time`, `cp`, `gc`, `map`) VALUES ('luck', 521, 67, 116, 'dr0_cliffside');
INSERT INTO `table` (`name`, `time`, `cp`, `gc`, `map`) VALUES ('aLr', 330, 76, 85, 'dr0_cliffside');
INSERT INTO `table` (`name`, `time`, `cp`, `gc`, `map`) VALUES ('Bupyc', 713, 212, 122, 'terablock');
INSERT INTO `table` (`name`, `time`, `cp`, `gc`, `map`) VALUES ('t00rch1k', 802, 222, 197, 'terablock');
[/SQL]
Нужно в результате выбрать name и gc с минимальным time для каждой map
 

wargasm

Новичок
[SQL]
SELECT DISTINCT(`map`), `name`, MIN(`time`), `gc` FROM `table` GROUP BY `map`
[/SQL]

умнее не придумал =(

UPD. Таблица уже есть, не я ее составлял. Я хочу только сделать запрос, т.к. в оригинале все гораздо хуже: выбираеться вся таблица и потом начинает мусолиться в массивах с кучей сортов и циклов, чтобы в итоге получить то что я хочу. Таблица не маленькая и на скорости сказываеться неплохо.
 

Bitterman

Новичок
wargasm
Блин. Как согласовываются
Хочу из таблицы
A | 2 | X
A | 1 | Y

получить A1Y а получаеться A1X потому что из третего столбика выбираеться не то значение где минимален второй столбик, а значение в первой строке с А =(
и
Если сортировать последний столбик, то будет работать до первого появления "B" значения в таблице
?
Почему в первой цитате у тебя нет никаких упоминаний про то, что в таблице может быть В?
Еще раз: объясни нормальным русским языком что ты хочешь получить.
Правильно ли я понимаю, что тебе нужно получить минимальное значение второго столбца + соответствующее ему значение третьего для каждого из значений первого столбца?

UPD. Кстати, про вышеприведенный запрос тебя уже спрашивали - пробовал ли ты читать мануал. Если да, то каков, на твой взгляд, смысл одновременного использования GROUP BY и DISTINCT? Пробовал ли ты воспользоваться поиском на форуме?
 

wargasm

Новичок
Bitterman
Упоминание про В есть в самом первом моем посте. Про одновременное использование GROUP BY и DISTINCT я уже разобрался. Мануал читал но не некоторые вещи всеравно не понял. Поиск дал мне две более менее похожие темы но это не то.

Еще раз что нужно: в первом столбце данные повторяються (несколько А, несколько B, C...) Во втором столбце числа, разбросанны хаотично. В третем столбце комментарий. Нужно найти для каждой группы одинаковых значений (для всех А, для всех В и т.д.) Наименьшее число второй колонки. И выбрать также комментарий напротив этого наименьшего значения.
 

Wicked

Новичок
wargasm
если задача стоит как "выбирать один кортеж, где f1 будет равен тому-то, а f2 будет минимальным для этого f1", то можно обойтись обычным запросом вида ... WHERE f1 = $x ORDER BY f2 asc LIMIT 1.

если задача такая же, но начинается с "выбрать все кортежи ...", или вообще "для каждого f1 выбрать кортежи, где f2 минимален для этого f1", то тот запрос уже не будет работать, и потребуется запрос с подзапросом.

Я бы сделал примерно в таком виде:
select * from `table`as `t1` inner join (select f1, min(f2) from `table` group by f1) as `t2` on (t1.f1 = t2.f1 and t1.f2 = t2.f2);
 
Сверху