Навеяло вот этой темой: https://php.ru/forum/threads/gruppirovka-znachenij.75370/ но топикстартер как-то сложно и неоднозначно, на мой взгляд, сформулировал задачу. Поэтому сделаю свой вариант. Пусть есть таблица с полем, где значения повторяются. Например дети и их возраст. Маша, 3 Петя, 3 Саша, 5 Кузьма, 5 Фархат, 4 Зина, 7 Зидан, 3 Родриго, 4 Надо создать выборку детей, где каждого возраста будет по одному ребенку. Причем если в возрастной группе более одного ребенка, то выбираем случайного из этой группы. Случайный — значит результат может меняться при повторном вызове запроса. Использовать диалект MySQL и строгость в группировке. Я знаю, что @Valick знает возможное решение. Наверное есть и другие варианты. --- Добавлено --- Варианты валидных выборок: Маша, 3 Фархат, 4 Саша, 5 Зина, 7и Петя, 3 Фархат, 4 Кузьма, 5 Зина, 7и т.д. Update: Добавил песочницу с неправильным запросом, который многим приходит на ум: https://www.db-fiddle.com/f/msQEzeuaYXJ42qTfKnkReb/0 предлагайте правильный, но пожалуйста сразу не спойлерите, можно в личку
@Fell-x27, желательно не выкладывать ответы в теме в течение некоторого времени, достаточно отписаться, что задача решена и отправить решение в личку @artoodetoo
Результаты (обновлено со вторым вариантом от runcore): @Valick - https://www.db-fiddle.com/f/g4LM5uEP1Z8kabtmHidr8x/0 Код (Text): SELECT SUBSTRING_INDEX( GROUP_CONCAT(`child_name` ORDER BY RAND() SEPARATOR '%%%'), '%%%',1) `name`, `child_age` FROM `children` GROUP BY `child_age` - - - - - @runcore - https://www.db-fiddle.com/f/xyWVxAR7vDtxoiH83Y4u2R/0 Код (Text): SELECT (SELECT child_name FROM children WHERE child_age=c.child_age ORDER BY RAND() LIMIT 1) AS name ,c.child_age AS age FROM children c GROUP BY c.child_age - - - - - @runcore #2 - https://www.db-fiddle.com/f/kfr8EvNiksHeQKxbBkTNeP/1 Код (Text): SELECT c.child_age, c.child_name, @age:=child_age FROM ( SELECT * FROM children ORDER BY child_age, RAND() ) c ,(SELECT @age:=0) cc WHERE c.child_age != @age - - - - - @keren - https://www.db-fiddle.com/f/skFkugv5GJkQeYqkVdTVBS/0 Код (Text): select name, age from (select child_age as age, (select child_name from children where child_age=age order by rand() limit 1) as name from children group by child_age) as t - - - - - Все эти запросы рабочие. По сути здесь три, а не четыре приёма: трюк с сортировкой внутри group_concat(); подзапрос с лимитом в одну строку внутри фразы select; переменная mysql помогает обнаружить смену возраста в отсортированном списке. Лично мне больше нравится с group_concat. От себя: Чтобы масштабировать приемы (1) и (2) на бОльшее число колонок (например если надо ещё фамилию и адрес вывести), нужно в случайной части находить ID а не имя, и использовать его в новом джойне с той же таблицей children: click here. Приём (3) изначально готов к любому числу колонок. (Наверное @keren пробовал расширенный запрос - больше двух колонок - иначе я не понимаю зачем здесь лишний уровень подзапросов.) @runcore в личке упоминал и вариант с group_concat, правда в незавершённом виде. То есть он просчитал всё Все молодцы, спасибо! Уверен, эту тему будут нагугливать и на неё ссылаться.
Можно придумать много вариантов. Например, такой: https://php.ru/forum/threads/mysql-algoritmy-poleznosti.54180/#post-594196
А почему ты решил не использовать готовую песочницу, а придумать свои имена? Я попробовал приспособить с мобилы, но очень неудобно - бросил.
1) Работаешь на мобильнике? Круто. Я до такого не дорос пока. 2) Я не использую всякие "песочницы", гитхабы и т.п. - у меня своя среда разработки на своём рабочем компе. Там делаю, там тестирую. А если нужно именно положить в "песочницу", нууу переформатируй да положи, делов то на пять минут.
Когда я работаю, я на форум не хожу --- Добавлено --- Спасибо, может быть как-нибудь, если не забуду.
Угу, есть чем. А когда начну гордиться, что использую "песочницы", уйду из разрабов, ибо "сдох разраб, остался пшик". п.с. Извиняюсь за трёп не по делу...