Запрос на выбор уникальных строк(MySQL)
Необходимо выбрать стороки из таблицы которые не повторяются
Делаю
SELECT DISTINCT name1 from tabl order name1
А мне нужно вывести дополнительное поле в запросе name2
SELECT DISTINCT name1,name2 from tabl order name1
но так чтобы DISTINCT относилось только к name1
Сам додуматься не могу помогите пожалуйста ????
SELECT name1, name2 FROM tabl GROUP BY name1
SELECT name1, name2 FROM tabl GROUP BY name1
Эта чушь работать не будет - нет агрегатных функций
2vadim_k: а чем DISTINCT не устраивает? Вы пробовали с ним работать?
Почитай про GROUP BY. Узнаешь много нового :)
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions-and-modifiers.html
MySQL под рукой нет потому приведу тебе пример того как ругается PostgreSQL на подобные "запросы"
Ошибка SQL:
ERROR: column "pays.gameid" must appear in the GROUP BY clause or be used in an aggregate function
В операторе:
SELECT sessionid, gameid FROM pays GROUP BY sessionid
Я в курсе. Читай вопрос автора топика:
Я лишь указал что один из ответов неправильный. :rolleyes:
Причем здесь PostgreSQL? В теме топика что написано? MySQL. В MySQL запрос нормально отрабатывает, а то, что там творится в PostgreSQL, MSSQL и т.д. так кого это волнует.
А ты проверял?
Вы не в церкви, вас не обманут (с) Остап Бендер ;)
действительно, нахрена нам стандарты соблюдать? кого волнует, что есть ANSI SQL... у нас же есть мускуль! недоСУБД для реальных пацанов :)
Необходимо выбрать стороки из таблицы которые не повторяются
Делаю
SELECT DISTINCT name1 from tabl order name1
А мне нужно вывести дополнительное поле в запросе name2
SELECT DISTINCT name1,name2 from tabl order name1
но так чтобы DISTINCT относилось только к name1
Сам додуматься не могу помогите пожалуйста ????
строки которые не повторяются надо выбирать по уникальному полю, ага? ты же хочешь сделать нечто странное, суть извращение.
SELECT DISTINCT name1,name2 from tabl order name1
считает уникальными (т. е. применяет DISTINCT) пары значений.
в твоем варианте:
SELECT name1, max(name2) from table group by name1 order by name1;
даст тебе имитацию distinct на name1 :)
У тебя к MySQL действительно какие-то обоснованные претензии или это просто повод к моим словам придраться? :)
Можешь дать какую-нибудь ссылку на сравнение MySQL с другими CУБД?
насчет сравнений - MySQL не с кем сравнивать. переодически публикуются различные тесты, где MySQL рвет на части всех подряд. угу. на простеньких базах - с примитивными SELECT'ами - may be. вот его область применения. AB пишет на своем сайте про компании, которые юзают мускуль в сурьезном продакшене и при мегазагрузках... только забывают добавить, что это там за тюнингом и кастомизацией не видно собссно сабжа :)
Если вот та хрень что ты написал действительно работает - то это уже вполне обоснованная претензия.
Необходимо выбрать стороки из таблицы которые не повторяются
Делаю
SELECT DISTINCT name1 from tabl order name1
А мне нужно вывести дополнительное поле в запросе name2
SELECT DISTINCT name1,name2 from tabl order name1
но так чтобы DISTINCT относилось только к name1
Сам додуматься не могу помогите пожалуйста ????
Под Мой Скуэль запросы не пишу, но по аналогии с Ораклом, думаю, такое прокатит:
t1.name1,
t2.name2
from
table1 t2,
(
select name1, min(id) id1 from table1 group by name1
) t1
where t1.id1 = t2.id
Если же использовать фирменные оракловые фенечки, запрос будет такой
( select name1, name2, row_number() over(partition by name1 order by name1) r_n from table1
where r_n < 2
Соответственно, никаких группировок и использование индексов (если последние наличествуют).
Прежде всего написанное действительно будет работать в МуСкуле! Ради интереса я это проверил собственноручно =) Да я тоже удивлен! Да оно не должно работать! Да это не соответствует стандартам, путает и нарушает всяческую логику (я, например, совершенно не понимаю, ну как бедному, бездушному, неразумному серверу догадаться какое из значений поля использовать чтобы "сплюснуть" записи в одну уникальную группу!! Это совершенно обескураживает и повергает в легкий ступор. Может криво сказал, но думаю должно быть понятно что я имел ввиду).
Вот что говорит по этому поводу один из справочников:
В MySQL расширены возможности использования оператора GROUP BY. Теперь в выражениях SELECT можно использовать столбцы или вычисления, которые не присутствуют в части GROUP BY. Это справедливо для любой возможной величины для этой группы. Данная возможность позволяет повысить производительность за счет исключения сортировки и группирования ненужных величин. Например, в следующем запросе нет необходимости в группировке customer.name:
mysql> SELECT order.custid,customer.name,MAX(payments)
FROM order,customer
WHERE order.custid = customer.custid
GROUP BY order.custid;
В ANSI SQL к предложению GROUP BY необходимо добавлять customer.name. В MySQL, если работа происходит не в режиме ANSI, это имя избыточно.
Не используйте данное свойство, если столбцы, пропущенные в части GROUP BY, не являются уникальными в данной группе! Возможны непредсказуемые результаты.
Лично я против возможности использовать такие конструкции и в этом согласен с RussianSpy, kot_, squirL. Но вариант который предложил shine - будет работать и в некоторых случаях даже будет работать правильно =) Но все-таки, давая такое решение я бы предостерег от возможных последствий, особенно если вопрошающий не слишком хорошо пока понимает, что ему нужно, и почему вопросы в подобной постановке не могут возникать даже впринципе у человека который более-менее понимает суть sql.
В вопросах построения БД поддерживаю <SCORP>, действительно смахивает на неудачно спроектированную структуру, от себя лишь добавлю, что еще может быть просто недопонимание сути задачи, т.е. "а че собссна надо?".
Ну а автору темы просто порекомендую логически помыслить, представить себе (можно даже визуально=)) как сервер будет объединять записи в уникальные группы. И каким образом серверу "угадывать" какое именно значение поля использовать при отображении уникальной группы, если же в рамках одной группы все значения этого поля одинаковые, то без разницы, использовать ли дистинкт, либо включить поле в секцию груп бай, либо воспользоваться вариантом предложенным shine - результат будет в данном случае одинаковый. Если поле, которое не указано в уникальных полях по которым формируется группа - может содержать в себе разные значения в рамках этой группы - рекомендую пересмотреть задачу и попытаться еще раз сформулировать, что в итоге надо получить.
Отлично сказано!
Лол! Для первого сообщения - это круто )) *сорри за ОТ*
жжот! а ещё в постгре нету динамического модуля чтения мыслей! вообще, ф топку эту СУБДу!
этого требует не PostgreSQL, а стандарт :) и никакого "Пи...ц". учите матчасть и, желательно, не на базе Мускуля.
Группировка будет проходить по всем полям указанным в GROUP BY. Хотя мне сдается что сам запрос крив до безобразия.
Плохому танцору сам знаешь что мешает.
ЗЫ Если ты не умеешь пользоваться "взрослыми" СУБД - лучше не пиши подобный бред на форуме дабы не выставлять себя чайником.