Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запрос на выбор уникальных строк(MySQL)

345
21 января 2007 года
vadim_k
312 / / 01.08.2006
Вот такая задача
Необходимо выбрать стороки из таблицы которые не повторяются
Делаю

SELECT DISTINCT name1 from tabl order name1

А мне нужно вывести дополнительное поле в запросе name2

SELECT DISTINCT name1,name2 from tabl order name1

но так чтобы DISTINCT относилось только к name1
Сам додуматься не могу помогите пожалуйста ????
337
21 января 2007 года
shine
719 / / 09.06.2006
Попробуй так:
SELECT name1, name2 FROM tabl GROUP BY name1
13
22 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: shine
Попробуй так:
SELECT name1, name2 FROM tabl GROUP BY name1



Эта чушь работать не будет - нет агрегатных функций


2vadim_k: а чем DISTINCT не устраивает? Вы пробовали с ним работать?

337
22 января 2007 года
shine
719 / / 09.06.2006
Цитата: RussianSpy
нет агрегатных функций



Почитай про GROUP BY. Узнаешь много нового :)

13
22 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Так. Вот ссылка. Идешь и читаешь что такое 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

355
22 января 2007 года
<SCORP>
786 / / 21.10.2006
решается просто включением поля gameid в group by
13
22 января 2007 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=<SCORP>;168580]решается просто включением поля gameid в group by[/QUOTE]

Я в курсе. Читай вопрос автора топика:
Цитата:
...но так чтобы DISTINCT относилось только к name1...



Я лишь указал что один из ответов неправильный. :rolleyes:

337
22 января 2007 года
shine
719 / / 09.06.2006
Цитата: RussianSpy
MySQL под рукой нет потому приведу тебе пример того как ругается PostgreSQL на подобные "запросы"



Причем здесь PostgreSQL? В теме топика что написано? MySQL. В MySQL запрос нормально отрабатывает, а то, что там творится в PostgreSQL, MSSQL и т.д. так кого это волнует.

13
22 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: shine
Причем здесь PostgreSQL? В теме топика что написано? MySQL. В MySQL запрос нормально отрабатывает, а то, что там творится в PostgreSQL, MSSQL и т.д. так кого это волнует.



А ты проверял?

337
22 января 2007 года
shine
719 / / 09.06.2006
Цитата: RussianSpy
А ты проверял?



Вы не в церкви, вас не обманут (с) Остап Бендер ;)

13
22 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Дома проверю. Если эта хрень заработает в мускуле - еще один мешок с г*вном в огород разработчиков этой недоСУБД
2
22 января 2007 года
squirL
5.6K / / 13.08.2003
Цитата: shine
Причем здесь 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 :)

355
22 января 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
а вообще, подобные задачи смахивают на плохо спроектированую БД
337
22 января 2007 года
shine
719 / / 09.06.2006
Цитата: squirL
у нас же есть мускуль! недоСУБД для реальных пацанов :)



У тебя к MySQL действительно какие-то обоснованные претензии или это просто повод к моим словам придраться? :)
Можешь дать какую-нибудь ссылку на сравнение MySQL с другими CУБД?

2
22 января 2007 года
squirL
5.6K / / 13.08.2003
обоснованные претензии? нет, что ты. я просто не люблю программные продукты, которые кладут на стандарты. MySQL уже поддерживает нормально constraints? ась? а пример выше? GROUP BY не должен работать без агрегатов.

насчет сравнений - MySQL не с кем сравнивать. переодически публикуются различные тесты, где MySQL рвет на части всех подряд. угу. на простеньких базах - с примитивными SELECT'ами - may be. вот его область применения. AB пишет на своем сайте про компании, которые юзают мускуль в сурьезном продакшене и при мегазагрузках... только забывают добавить, что это там за тюнингом и кастомизацией не видно собссно сабжа :)
1
23 января 2007 года
kot_
7.3K / / 20.01.2000
Цитата: shine
У тебя к MySQL действительно какие-то обоснованные претензии или это просто повод к моим словам придраться? :)


Если вот та хрень что ты написал действительно работает - то это уже вполне обоснованная претензия.

294
23 января 2007 года
Plisteron
982 / / 29.08.2003
Цитата: vadim_k
Вот такая задача
Необходимо выбрать стороки из таблицы которые не повторяются
Делаю

SELECT DISTINCT name1 from tabl order name1

А мне нужно вывести дополнительное поле в запросе name2

SELECT DISTINCT name1,name2 from tabl order name1

но так чтобы DISTINCT относилось только к name1
Сам додуматься не могу помогите пожалуйста ????


Под Мой Скуэль запросы не пишу, но по аналогии с Ораклом, думаю, такое прокатит:

 
Код:
select
    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 from
(    select name1, name2, row_number() over(partition by name1 order by name1) r_n from table1    
where r_n < 2

Соответственно, никаких группировок и использование индексов (если последние наличествуют).
385
23 января 2007 года
SomewherSomehow
477 / / 25.07.2004
Позволю себе сделать некоторые комментарии по теме =)

Прежде всего написанное действительно будет работать в МуСкуле! Ради интереса я это проверил собственноручно =) Да я тоже удивлен! Да оно не должно работать! Да это не соответствует стандартам, путает и нарушает всяческую логику (я, например, совершенно не понимаю, ну как бедному, бездушному, неразумному серверу догадаться какое из значений поля использовать чтобы "сплюснуть" записи в одну уникальную группу!! Это совершенно обескураживает и повергает в легкий ступор. Может криво сказал, но думаю должно быть понятно что я имел ввиду).

Вот что говорит по этому поводу один из справочников:
Цитата:

В 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 - результат будет в данном случае одинаковый. Если поле, которое не указано в уникальных полях по которым формируется группа - может содержать в себе разные значения в рамках этой группы - рекомендую пересмотреть задачу и попытаться еще раз сформулировать, что в итоге надо получить.

13
23 января 2007 года
RussianSpy
3.0K / / 04.07.2006
2SomewherSomehow: +10
Отлично сказано!
26K
12 февраля 2007 года
mistercx
2 / / 12.02.2007
Народ! Решал проблему с GROUP BY три часа! - Решил. Синтаксис PostgreSQL почему-то требует, чтобы в GROUPE BY включались ВСЕ поля из запроса SELECT!!! Группировка будет проходить по первому полю, указанному в списке. Пи...ц:eek:
308
12 февраля 2007 года
Комаджу
850 / / 26.07.2006
Цитата: mistercx
Народ! Решал проблему с GROUP BY три часа! - Решил. Синтаксис PostgreSQL почему-то требует, чтобы в GROUPE BY включались ВСЕ поля из запроса SELECT!!! Группировка будет проходить по первому полю, указанному в списке. Пи...ц:eek:

Лол! Для первого сообщения - это круто )) *сорри за ОТ*

355
13 февраля 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
Цитата: mistercx
Синтаксис PostgreSQL почему-то требует, чтобы в GROUPE BY включались ВСЕ поля из запроса SELECT!!!



жжот! а ещё в постгре нету динамического модуля чтения мыслей! вообще, ф топку эту СУБДу!

2
13 февраля 2007 года
squirL
5.6K / / 13.08.2003
Цитата: mistercx
Народ! Решал проблему с GROUP BY три часа! - Решил. Синтаксис PostgreSQL почему-то требует, чтобы в GROUPE BY включались ВСЕ поля из запроса SELECT!!! Группировка будет проходить по первому полю, указанному в списке. Пи...ц:eek:


этого требует не PostgreSQL, а стандарт :) и никакого "Пи...ц". учите матчасть и, желательно, не на базе Мускуля.

13
13 февраля 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: mistercx
Народ! Решал проблему с GROUP BY три часа! - Решил. Синтаксис PostgreSQL почему-то требует, чтобы в GROUPE BY включались ВСЕ поля из запроса SELECT!!! Группировка будет проходить по первому полю, указанному в списке. Пи...ц:eek:



Группировка будет проходить по всем полям указанным в GROUP BY. Хотя мне сдается что сам запрос крив до безобразия.

Плохому танцору сам знаешь что мешает.

ЗЫ Если ты не умеешь пользоваться "взрослыми" СУБД - лучше не пиши подобный бред на форуме дабы не выставлять себя чайником.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог