MySQL, уникальность
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 задать общую уникальность в результате
скажите что должен вернуть запрос на таких данных
1|5
1|6
2|5
2|6
3|5
3|6
1|7
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)
Что это, и как относится к написанному выше?
Извините, но мне не хочется объяснять Вам очевидные вещи.
Единственная очевидная тут вещь - это то, что вы написали явный бред.
Не имеющий отношения ни к вопросу автора, ни к моему уточняющему вопросу.
Первый запрос выбирает единственную строку в которой id2 уникален.
Второй запрос выбирает множество строк, в котором id2 не повторяется.
Для начала, на какой вопрос вы отвечаете? На вопрос автора? Тогда откуда у вас данные:
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
Ну почему же бред?
разобрался. ребят, всем спасибо