Вроде простой вопрос насчет DISTINCT

Ufai Rock

Новичок
Вроде простой вопрос насчет DISTINCT

Есть запрос вида SELECT DISTINCT field1, field2 FROM table
Он селектирует уникальные комбинации field1 и field2. А если мне нужен только уникальный только field1, а не эта комбинация? Т.е. запрос нашел скажем 10 строк с уникальным field1, и просто посмотрел какие у них field2.

Подскажите, а то никак не пойму. Спасибо заранее.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Я непонял что ты хочешь спросить.

[telepat_mode]
Ты хочешь исключить из списка полей field1 что-ли?

Чем не подходит GROUP BY ?
 

Ufai Rock

Новичок
GROUP BY не решит проблему. По крайней мере, я так это вижу. Попробую наглядно показать, есть таблица из двух полей:
Выглядит так (строки идут сверху вниз, ибо форум)
field1 1 2 2 2
field2 1 2 3 4

Если мы на такую штуку применим SELECT DISTINCT field1, field2 FROM table - то мускул выдаст все строки. Ибо совпадений нет. А мне надо, чтоб он посмотрел только по field1, т.е. выбрал среди него только 1 и 2 (последнее две двойки брать уже не надо, т.к. они уже были). Но (!) нужно чтоб этот же запрос и узнал field2 для этих двух позиций.

Надеюсь, получилось более внятно объяснть )
 

Bitterman

Новичок
Ufai Rock
гм, по-моему, GROUP BY как раз таки решит проблему в том виде, в котором она представлена в твоем втором посте.
Но вообще хотелось бы уточнить, что означает
и узнал field2 для этих двух позиций.
? Нужны значения field2 для строки, где field1 равно 1 и для первой строки, где field1 равно 2? Если так, то попробуй все-таки GROUP BY.
 

Spacewalker

Новичок
Объясню на пальцах что хочет от вас человек, ибо сейчас сам столкнулся с проблемой.

если вы выполняете запрос:
select DISTINCT (`field1`) from `table`
вы получите вывод всех уникальных field1

а если вы выполняете запрос:
select DISTINCT (`field1`),`field2` from `table`
вы получите вывод всех field1 и field2, то есть получается, что:

select DISTINCT (`field1`),`field2` from `table` == select `field1`,`field2` from `table`

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

Далее:

GROUP BY - не решает эту проблему. Он вообще тогда выводит левые записи.
select DISTINCT (`field1`),`field2` from `table` - я попросил своего друга проверить этот запрос. Вначале он кричал, что я ламер и у меня ошибка в ДНК (ну, по-дружески так), а потом ... залип.

Мы предположили, что во всем виновата клятая суксь, и потому проверили все это на никсах. Результат оказался тот же.

Иными словами, аггрегатная функция работает только тогда, когда вы больше не просите включить в результат еще одно поле. Либо вы получаете уникальные значения имен людей (без возможности узнать какой идентификатор id записи принадлежит имени), либо DISTINCT просто не срабатывает и в запрос включаются все записи.

Я кончил :)

З.Ы. жду ответов тех, кто уже решил эту проблему, ибо пока что вместо одного запроса мне приходится использовать индийский код:

Так, например, задачу по выводу пяти последних сообщений в форуме, темы которых не повторяются, мне пришлось решать в два этапа:

- вначале я сделал пробежку по всем id-постам и набрал в массив 5 уникальных номеров id (через in_array)
- затем сделал запрос через select * from `table` where id in (массив с id)

К сожалению, эта проблема решается вот так по-индийски не в первый раз и я уже даже аккаунт сделал здесь, чтобы получить ответ.

-~{}~ 07.04.08 06:05:

Забыл добавить: mysql 5.0.x, php 5.2
 

zerkms

TDD infected
Команда форума
select DISTINCT (`field1`),`field2` from `table` == select `field1`,`field2` from `table`
ложь
select DISTINCT (`field1`),`field2` from `table` == select DISTINCT `field1`,`field2` from `table`

иными словами нельзя получить идентификаторы записей, если вы спрашиваете уникальные имена людей из таблицы. Вы сможете получить только сами уникальные имена.
и это логично, потому что их может быть несколько

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

З.Ы. жду ответов тех, кто уже решил эту проблему, ибо пока что вместо одного запроса мне приходится использовать индийский код:
вопрос задаётся с завидным постоянством в среднем раз в 2 недели. решение ищется легко
http://jan.kneschke.de/projects/mysql/groupwise-max
 
Сверху