Уникальные значения по одному полю, рандомные - по второму

Коля Дубр

Новичок
Уникальные значения по одному полю, рандомные - по второму

Есть таблица из двух столбцев, `id` уникальный, а `val` может повторяться. Например такая:

val | id
-------------
aaa | 1
bbb | 2
ccc | 3
aaa | 4
bbb | 5

Необходимо в 1 запрос выбрать рандомно N строк, причем все `val` должны быть разными. Т.е. получить такую таблицу:

val | id
------------
aaa | 4 (или 1)
bbb | 2 (или 5)
ccc | 3

Проблема в том, что если использовать GROUP BY, для каждого уникального `val` всегда будет доставаться одна и та же строка, а именно - первая по времени появления в базе. Соответственно, куда-то нужно внедрить ORDER BY RAND(), есть подозрение, что надо как-то объединять таблицу саму с собой, но никак не могу придумать, как.

Заранее благодарен.
 

Коля Дубр

Новичок
Нет. DISTINCT будет выбирать уникальные строки, а они все уникальны, т.к. есть `id`.

Да, и еще. Очень хотелось бы, чтоб работало под 3.23.53-max, т.е. без вложенных запросов.
 

alpine

Новичок
Коля Дубр
Для чего это нужно?

Что говорит запрос:
SELECT COUNT(DISTINCT val) FROM `table` ?
 

Коля Дубр

Новичок
Пишу ротатор ссылок. В таблице хранятся пары "код - домен". Нужно рандомно выбрать 10 ссылок, при этом они все должны указывать на разные домены.

Больше всего похож на правду вот такой запрос:

SELECT `domain`, `code` FROM `tab` GROUP BY `domain` ORDER BY RAND() LIMIT 10

Единственная проблем - при группировке по домену всегда будет выводиться первая строка, найденная для данного домена. Сначала происходит группировка, и только потом - сортировка. Соответственно, мне нужно поменять их местами (по очередности выполнения).
 

alpine

Новичок
Коля Дубр
Выноси логику в ПХП. Там можно сделать в два селекта.
Можно попробовать извратиться через временную таблицу и джоин, но это того не стоит imho.
 
Сверху