рандомизировать результаты SQL - PullRequest
1 голос
/ 11 марта 2012

На моей веб-странице я беру свои данные с базы данных и показываю их на странице результатов. Я хотел бы отсортировать результаты и по порядку (вот перевод гугл переводчик). Я имею в виду следующее: у меня есть поле с именем "type", и оно имеет значение a, b или c. Когда я выбираю данные, он возвращает результаты как

a a a a b b b c c c

но мне нравится видеть это как

a b c a b c a b c a

Мой вопрос, каково лучшее решение для этого (это возможно с запросом SQL?)

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 12 марта 2012

Идея решения заключается в том, чтобы номера строк были пронумерованы от 1 и выше в зависимости от поставщика.если строки с типом 'a', где пронумерованы от 1..4, и строки с типом 'b', где пронумерованы от 1 ..3 и строки с типом 'c', где пронумерованы от 1..3, то вы можете легко получить то, чтоВы хотели с помощью «Order By» на этих числах.

для примера, я предполагаю, что ваша таблица называется «my_table» и имеет два поля: тип и данные.

, чтобы сделать rownum в mysql, я буду использовать то, что былоздесь описано: rownum в mysql

Теперь давайте предположим, что мы хотим выбрать все строки с типом 'a' и дать им возрастающий номер строки.мы можем сделать это следующим образом:

select type,data,@rownuma := @rownuma+1 as order_num
from my_table,(select @rownuma:=0) ra
where type='a'

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

select type,data
from
(
select type,data,@rownuma := @rownuma+1 as order_num
from my_table,(select @rownuma:=0) ra
where type='a'
union all
select type,data,@rownumb := @rownumb+1 as order_num
from my_table,(select @rownumb:=0) rb
where type='b'
union all
select type,data,@rownumc := @rownumc+1 as order_num
from my_table,(select @rownumc:=0) rc
where type='c'
) in_tab
order by order_num,type

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

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

select type,data
from
(
select type,data,
       case when type='a' then @rownuma := @rownuma+1 
            when type='b' then @rownumb := @rownumb+1
            when type='c' then @rownumc := @rownumc+1
       end as order_num
from my_table, (select @rownuma:=0) ra, (select @rownumb:=0) rb, (select @rownumc:=0) rc 
) in_tab
order by order_num,type

вторая версия еще лучше, если у вас есть больше условий (условие where) для выбора строк, поскольку вам не нужно будет повторять их в каждом подзапросе, который является частьюсоюза в первой версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...