MySQL странное требование заказа - PullRequest
1 голос
/ 17 ноября 2011

У меня есть запрос MySQL, например:

SELECT
id,
CASE
WHEN (cond1) THEN 1
WHEN (cond2) THEN 2
WHEN (cond3) THEN 3
END `rank`
FROM `table`

Есть ли способ заказать его так, чтобы полученный результат имел чередующийся порядок:

rank
1
2
3
1
2
3

порядок 1, 2 и 3 не имеет значения, если они следуют шаблону 123123 [...].Это может быть порядок, в котором они были введены в базу данных, или случайный.

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

rock      1
paper     2
scissors  3
rock      1
rock      1
rock      1
scissors  3
paper     2

Что я хочусделать, это заказать их камень, бумагу, ножницы, камень, бумагу, ножницы так долго, как он может достичь.

Я делаю это, потому что большинство моих данных (> 90%) - это ножницы, и когда яЯ отображаю мои данные с нумерацией страниц, первая страница (LIMIT 0, N) - это все ножницы.Даже ORDER BY RAND () не поможет из-за этого большинства, вот почему.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Модификация из ответа на аналогичный вопрос в Stackoverflow:

SELECT name, cond
FROM (
   SELECT name, cond, @a := @a+1 AS inc 
       FROM table, ( select @a := 0 ) as SqlVars 
       WHERE cond = 1
   UNION
   SELECT name, cond, @b := @b+1 AS inc 
       FROM table, ( select @b := 0 ) as SqlVars 
       WHERE cond = 2
   UNION
   SELECT name, cond, @c := @c+1 AS inc 
       FROM table, ( select @c := 0 ) as SqlVars 
       WHERE cond = 3
)
ORDER BY inc

Ограничено ограниченным числом условий.Если условия не фиксированы, ограничены малыми, то вам следует пройти процедуру.И это тоже не оптимальный запрос.

Другой подход - добавить новое поле в базу данных и позаботиться о вставке туда значения goog (MAX с тем же условием + 1), чтобы использовать этот столбец дляупорядоченность.

0 голосов
/ 17 ноября 2011

Как насчет использования модуля?

SELECT id, (((id - 1) % 3) + 1 ) FROM [...]

Если ваш идентификатор начинается с 1 и увеличивается без перерыва, второй столбец будет иметь значение 1,2,3,1,2,3.

Если вы выберете из Генератор строк MySQL и выполните внутреннее объединение исходной таблицы по рангу, вы, вероятно, сможете заставить ее работать таким образом.

...