2014-11-12 2 views
1

Этот вопрос задал много вопросов о Stackoverflow, но я столкнулся с чем-то другим.номер строки в порядке возрастания MySQL

SET @rownum = 0; 
SELECT DISTINCT doc.id, 
       doc.created_date, 
       (@rownum := @rownum + 1) AS rownumbers 
FROM document AS doc 
     INNER JOIN document_type_master dt 
       ON doc.document_type_id = dt.id 
ORDER BY doc.id ASC; 

Вышеуказанный запрос дает мне следующий результат.

id  created_date   rownumbers 
5664 2014-06-05 07:23:40 1 
5665 2014-06-06 06:37:34 2 
5666 2014-06-06 10:25:56 3 
5667 2014-06-06 10:33:39 4 
5668 2014-06-06 11:28:28 5 

Если изменить ORDER BY doc.id ASC к ORDER BY doc.id DESC затем выход

id  created_date   rownumbers 
6364 2014-11-11 17:57:04 691 
6363 2014-11-11 11:09:49 690 
6362 2014-11-11 10:58:34 689 
6361 2014-11-10 17:39:47 688 
6360 2014-11-10 16:59:53 687 

Я экспериментировал несколько вещей, и считаю, что если удалить DISTINCT из моего запроса, то rownumbers запускается из 1,2,3... в случае ORDER BY doc.id DESC.

id  created_date   rownumbers 
6364 2014-11-11 17:57:04 1 
6363 2014-11-11 11:09:49 2 
6362 2014-11-11 10:58:34 3 
6361 2014-11-10 17:39:47 4 
6360 2014-11-10 16:59:53 5 

Я также попытался дающую заказ на rownumbers как ORDER BY doc.id DESC, rownumbers ASC, но не работает для меня.

Я хочу rownumbers значение всегда должно быть в ASC заказ независимо от того, как я пользуюсь DISTINCT или нет.


Update

@Barmar является правильным, но если я использую rownumbers в WHERE статье как

rownumbers between 1 and 5 то есть показывает ошибку Error Code: 1054. Unknown column 'rownumbers' in 'where clause'

+0

То же, что и выход 2 –

ответ

2

Обработка ORDER BY делается после генерируя все строки в результате. Поэтому сначала он присваивает все столбцы rownumber, обрабатывая данные в любом порядке в базе данных, а затем переписывает их в обратном порядке.

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

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

SET @rownum = 0; 
SELECT x.*, (@rownum := @rownum + 1) AS rownumbers 
FROM (
    SELECT DISTINCT doc.id, 
        doc.created_date 
    FROM document AS doc 
      INNER JOIN document_type_master dt 
        ON doc.document_type_id = dt.id 
    ORDER BY doc.id DESC) AS x 

обратиться к rownumbers в ИНЕКЕ, вам нужен другой уровень подзапроса:

SELECT * 
FROM (
    SELECT x.*, (@rownum := @rownum + 1) AS rownumbers 
    FROM (
     SELECT DISTINCT doc.id, 
         doc.created_date 
     FROM document AS doc 
       INNER JOIN document_type_master dt 
         ON doc.document_type_id = dt.id 
     ORDER BY doc.id DESC) AS x 
    ) AS y 
WHERE rownumbers BETWEEN 1 AND 5 

или вы можете быть в состоянии использовать HAVING:

SELECT x.*, (@rownum := @rownum + 1) AS rownumbers 
FROM (
    SELECT DISTINCT doc.id, 
        doc.created_date 
    FROM document AS doc 
      INNER JOIN document_type_master dt 
        ON doc.document_type_id = dt.id 
    ORDER BY doc.id DESC) AS x 
HAVING rownumbers BETWEEN 1 AND 5 

Но я видел какое-то странное поведение при попытке использовать HAVING с псевдонимами, которые исходят из таких переменных, по-видимому, из-за ярлыков, которые принимает MySQL.

+0

Это простая вещь, которую я пропустил. Спасибо человеку –

+0

, если я использую 'rownumbers', где clause, как' rownumbers между 1 и 5', тогда он говорит 'Код ошибки: 1054.Неизвестный столбец «rownumbers» в «where clause» –

+0

Есть ли другой способ создания множественного псевдонима –

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