2015-02-08 2 views
1

Возможно, худшее название за всю историю. То, что у меня есть таблица 3 колонкиMySQL select x количество записей из таблицы по столбцу

id | name | type 
1 | John | 1 
2 | Sam | 1 
3 | Bob | 2 
4 | Joe | 2 
5 | Al | 3 
6 | Paul | 3 

нужно выбрать 3 случайных людей, которые имеют различные типы

действительный результат будет

id | name | type 
1 | John | 1 
3 | Bob | 2 
6 | Paul | 3 

неверный результат будет

id | name | type 
3 | Bob | 2 
5 | Al | 3 
6 | Paul | 3 

Что я думал, что смогу сделать, это

SELECT id, name, type FROM table WHERE type = 1 
UNION 
SELECT id, name, type FROM table WHERE type = 2 
UNION 
SELECT id, name, type FROM table WHERE type = 3 

Но это не реально, потому что это просто упрощенный пример, в реальном коде у меня есть еще много столбцов для выбора и выполнения объединений, и если бы я сделал это таким образом, это было бы ужасно недостижимым. Какие-либо предложения?

ответ

1

Ниже приведен метод, который использует переменные. Предположительно, вам нужна случайная запись каждого типа:

select id, name, type 
from (select t.*, 
      (@rn := if(@t = type, @rn + 1, 
         if(@t := type, 1, 1) 
         ) 
      ) as seqnum 
     from table t cross join 
      (select @t := 0, @rn := 0) vars 
     order by type, rand() 
    ) t 
where seqnum = 1; 
+0

Кажется, что это работает, однако я мог бы принести пользу, если бы вы могли объяснить идею, потому что она кажется слишком сложной для меня. –

+0

Да, используйте это, и никто никогда не поймет ваш sql или не исправит ошибки. : O – Umingo

1

Почему бы не попробовать что-нибудь с группой.

select id,name,type from table group by type order by rand() limit 0,XXX 
+0

Я не мог использовать группу, потому что тогда он объединил бы все мои записи из объединений, которые я выполняю. –

+0

На самом деле вышеприведенный код выглядит как способ. Если вам нужно присоединиться к чему-то еще с этим, интегрируйте этот запрос в качестве подтаблицы в основной запрос. – jwatkins

+0

О, и вам не нужна предельная оговорка – jwatkins

Смежные вопросы