SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.11.2014 05:00:30

Skandalli
Участник
Зарегистрирован: 31.01.2010
Сообщений: 2

Выбрать произвольное значение, но не более одного по каждому пункту

Здравствуйте. Вот, бьюсь.
Есть таблица типа

type|text|data (у всех одинаковая (пока)
---------------
1 | qw
2 | as
3 | re
4 | zx
3 | sd
2 | df
1 | fg
2 | gh

Мне нужно из каждого типа (1, 2...) выбрать один произвольный т.е. или (1|qw) или (1|fg).
SELECT text FROM `day` WHERE date = 1130 GROUP BY type
Как допилить запрос, чтоб был рандом? Т.е. типа сперва все перемешиваем, а потом GROUP BY

Неактивен

 

#2 15.11.2014 14:44:52

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выбрать произвольное значение, но не более одного по каждому пункту

Код:

mysql> create table t_7265(a int, b int);
Query OK, 0 rows affected (0.31 sec)

mysql> insert into t_7265 values(1,11),(1,111),(2,2),(2,222),(1,1111),(2,2222),(1,1),(2,22);
Query OK, 8 rows affected (0.00 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> SELECT a,b FROM ( SELECT a, b FROM t_7265 ORDER BY RAND()) AS subquery GROUP BY a;
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    2 |   22 |
+------+------+
2 rows in set (0.00 sec)

mysql> SELECT a,b FROM ( SELECT a, b FROM t_7265 ORDER BY RAND()) AS subquery GROUP BY a;
+------+------+
| a    | b    |
+------+------+
|    1 | 1111 |
|    2 |    2 |
+------+------+
2 rows in set (0.00 sec)

mysql> SELECT a,b FROM ( SELECT a, b FROM t_7265 ORDER BY RAND()) AS subquery GROUP BY a;
+------+------+
| a    | b    |
+------+------+
|    1 | 1111 |
|    2 | 2222 |
+------+------+
2 rows in set (0.00 sec)

Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 16.11.2014 07:37:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выбрать произвольное значение, но не более одного по каждому пункту

MariaDB 5.5 и выше упрощает from-подзапрос:
select `test`.`t_7265`.`a` AS `a`,`test`.`t_7265`.`b` AS `b` from `test`.`t_7265` group by `test`.`t_7265`.`a`

Универсальным решением будет:

SELECT a, (SELECT b FROM t_7265 AS t2 WHERE t2.a=t_7265.a ORDER BY RAND() limit 1) FROM t_7265 GROUP BY a;

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson