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

Ваш аккаунт

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

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

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

MySQL, уникальность

61K
18 августа 2010 года
FXIX
4 / / 18.08.2010
Собственно таблица:
http://imglink.ru/show-image.php?id=6589f15810e48f29a354410b425f836a

Вопрос: как выбрать только те строки в которых id2 будет уникально. Т.е. к примеру делаем GROUP BY id1 и выборка получается такая:
1 | 5
2 | 5
Потому что в поле id2 падает первое попавшееся значение. т.е. в итоговой таблице есть дубль.

А надо чтобы было:

1 | 6
2 | 5
или
1 | 5
2 | 6

Т.е. группировка по полю id1, с возможностью для id2 задать общую уникальность в результате
385
18 августа 2010 года
SomewherSomehow
477 / / 25.07.2004
то что в mysql позволяется делать селект и групбай не указывая в селект всех полей групбай - не есть хорошо, и даже больше - не соответствует стандарту ansi sql и учит думать неправильно.

скажите что должен вернуть запрос на таких данных
1|5
1|6
2|5
2|6
3|5
3|6
1|7
43K
19 августа 2010 года
loki231
76 / / 27.09.2009
select max(id1), id2 from aaa group by id2 having count(0)=1;

xxx=> select * from aaa;
id1 | id2
-----+-----
1 | 5
1 | 6
2 | 5
2 | 6
1 | 7
(записей: 5)

xxx=> select max(id1) as id1, id2 from aaa group by id2 having count(0)=1;
id1 | id2
-----+-----
1 | 7
(1 запись)

PS. Правда, использовался Postgresql. Но всё же.


вот так

xxx=> select max(id1) as id1, id2 from aaa group by id2;
id1 | id2
-----+-----
1 | 7
2 | 6
2 | 5
(записей: 3)
385
19 августа 2010 года
SomewherSomehow
477 / / 25.07.2004
Что это, и как относится к написанному выше?
43K
19 августа 2010 года
loki231
76 / / 27.09.2009
Извините, но мне не хочется объяснять Вам очевидные вещи.
385
19 августа 2010 года
SomewherSomehow
477 / / 25.07.2004
Какие очевидные вещи?
Единственная очевидная тут вещь - это то, что вы написали явный бред.
Не имеющий отношения ни к вопросу автора, ни к моему уточняющему вопросу.
43K
19 августа 2010 года
loki231
76 / / 27.09.2009
Ну почему же бред?
Первый запрос выбирает единственную строку в которой id2 уникален.
Второй запрос выбирает множество строк, в котором id2 не повторяется.
385
19 августа 2010 года
SomewherSomehow
477 / / 25.07.2004
Хорошо, попробую объяснить наводящими вопросами.

Для начала, на какой вопрос вы отвечаете? На вопрос автора? Тогда откуда у вас данные:
1 | 5
1 | 6
2 | 5
2 | 6
1 | 7
Ведь у автора:
1 | 5
1 | 6
2 | 5
2 | 6
На мой вопрос? Опять же, откуда такие данные, я спрашивал автора что должно вернуться при таком множестве
1|5
1|6
2|5
2|6
3|5
3|6
1|7
Первый запрос я так понимаю:
[QUOTE=loki231]select max(id1) as id1, id2 from aaa group by id2 having count(0)=1;
Первый запрос выбирает единственную строку в которой id2 уникален.
[/QUOTE]
id2 "уникален" в любой строке, т.к. в одной строке содержится только одно значение id2. Вы видимо имели ввиду возвращает единственную группу, в которой есть только одна строка, потому что других строк с таким же id2 для данной группы не нашлось.
Даже если б вы правильно объяснили, непонятно как это коррелирует с вопросм автора, который говорил о том что ему нужны уникальные значения по этому полю в рамках всей выборки.
Второй запрос это видимо:
[QUOTE=loki231]select max(id1) as id1, id2 from aaa group by id2;
Второй запрос выбирает множество строк, в котором id2 не повторяется.[/QUOTE]
почему вы решили использовать функцию max, а не min например? Почему отобрали запись 1|7 а не 1|5, чем одна лучше другой (к тому же автор желал получить 1|5 или 1|6)? И в любом случае ваш результат в итоге возвращает:
1 | 7
2 | 6
2 | 5
что никак не подпадает по запрос автора с группировкой по первому полю и уникальностью при этом во втором, ведь у вас дублируются значения первого столбца второй и третьей строки!

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

Надеюсь теперь понятно почему
Цитата: loki231
Ну почему же бред?

61K
25 сентября 2010 года
FXIX
4 / / 18.08.2010
разобрался. ребят, всем спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог