2013-07-19 8 views
0

У меня есть таблица с различными категориями. Можно ли вернуть две случайные строки из каждой категории?SQL: получить 2 строки из каждой категории

Мой стол:

----------------------------- 
| ID | CATEGORY    | 
----------------------------- 
| 1 | PINK     | 
| 2 | GREEN    | 
| 3 | PINK     | 
| 4 | GREEN    | 
| 5 | BLUE     | 
| 6 | BLUE     | 
| 7 | BLUE     | 
| 8 | PINK     | 
| 9 | GREEN    | 
----------------------------- 

Что я хочу вывести:

----------------------------- 
| ID | CATEGORY    | 
----------------------------- 
| 1 | PINK     | 
| 8 | PINK     | 
| 2 | GREEN    | 
| 4 | GREEN    | 
| 6 | BLUE     | 
| 7 | BLUE     | 
----------------------------- 
+0

Да. можно http://stackoverflow.com/questions/19412/how-to-request-a-random-row-in-sql – zod

+0

^Это другой вопрос – user2217162

+0

определить «случайный» – Woot4Moo

ответ

0
select distinct c1.ID, c2.category 
from mytable c1 
join mytable c2 ON c1.category = c2.category and c1.ID <> c2.ID 
group by c1.category, c2.ID; 
+0

Это работает, но позволяет сказать, что я хочу получить 5 строк из каждой категории, мне нужно будет присоединиться к 5 таблицам? – user2217162

+0

Для каждого увеличения числа возвращаемых строк вам потребуется дополнительное самосоединение и группа по идентификатору. Например, чтобы получить 3 из каждой категории: выбрать отличный c1.ID, c2.category из страны c1 присоединяйтесь к стране c2 ON c1.category = c2.category и c1.ID <> c2.ID присоединяйтесь к стране c3 ON c2.category = c3.category и c1.ID <> c3.ID группа по c1.category, c2.ID, c3.ID; – udog

+0

Привет, пользователь2217162, любой из этих ответов подходит вам? – udog

0

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

select t.* 
from t join 
    (select t.category, substring_index(group_concat(id order by rand()), ',', 2) as ids 
     from t 
     group by category 
    ) tc 
    on find_in_set(t.id, tc.ids) > 0; 

Он использует group_concat() для размещения идентификаторов в списке в произвольном порядке, выбирает первые два и возвращается и находит строки с этими идентификаторами. Он легко обобщается на более чем 2 ids.

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