MySQL сортируют по-разному в «пакетном режиме» - PullRequest
0 голосов
/ 04 июля 2011

Ниже приведен стандартный запрос, который сортирует вес в порядке убывания.

SELECT * FROM article ORDER BY weight DESC LIMIT 0, 4
+-------------+--------+
| title       | weight |
+-------------+--------+
| B           | 2      | 
| E           | 2      | 
| Y           | 2      | 
| A           | 1      | 
| C           | 1      | 
| D           | 1      | 
| F           | 1      | 
| G           | 1      | 
| X           | 1      | 
| Z           | 1      | 
| I           | 1      | 
| G           | 1      | 
+-------------+--------+

Однако я хочу отсортировать его по-разному, исходя из значения веса.

+-------------+--------+
| title       | weight |
+-------------+--------+
| B           | 2      | 
| A           | 1      | 
| C           | 1      | 
| D           | 1      | 
| E           | 2      | 
| F           | 1      | 
| G           | 1      | 
| X           | 1      | 
| Y           | 2      | 
| Z           | 1      | 
| I           | 1      | 
| G           | 1      | 
+-------------+--------+

Запись со значением веса 2 выбирается только один раз и сортируется сверху. Затем следуют записи со значением веса 1.

Ответы [ 2 ]

1 голос
/ 05 июля 2011

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

SELECT title, weight
FROM
    ( SELECT title, weight
           , @rownumber2 := @rownumber2 + 3 AS rn
      FROM article
         , ( SELECT @rownumber2 := 1 ) AS dummy
      WHERE weight = 2
      ORDER BY title                     --- optional, configure it for the 
                                         --- ordering of rows with weight = 2
    UNION ALL

      SELECT title, weight
           , @rownumber1 := @rownumber1 + 1 AS rn
      FROM article
         , ( SELECT @rownumber1 := 3 ) AS dummy
      WHERE weight = 1
      ORDER BY title DESC                --- optional, configure it for the 
                                         --- ordering of rows with weight = 1
    ) AS insaneOrdering

ORDER BY rn
       , weight DESC ;
1 голос
/ 04 июля 2011

Используя подход как в этих ответах:

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

Прежде чем продолжить, обратите внимание, что, хотя официальная документация признает, что

Вы можете получить ожидаемые результаты,

также советует,

Как правило, вы никогда не должны присваивать значение пользовательской переменной и читать значение в том же выражении.

(под то же утверждение это означает утверждение, отличное от SET.)

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

SET @row2 = -1;
SET @row_other = -1;

SELECT
  title, weight
FROM (
  SELECT
    title, weight,
    @row2 := @row2 + CASE weight WHEN 2 THEN 1 ELSE 0 END AS weight2_row,
    @row_other := @row_other + CASE weight WHEN 2 THEN 0 ELSE 1 END AS other_weight_row
  FROM article
) s
ORDER BY
  CASE weight WHEN 2 THEN @row2 ELSE @row_other DIV 3 END,
  weight = 2 DESC

Конкретный порядок строк, не являющихся Weight=2, не определен, как и в вашем вопросе.

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