"SELECT id, title, @ natusort:=@natusort + 1 AS ordercount" не увеличивается, как ожидалось - PullRequest
0 голосов
/ 01 августа 2020

Мой запрос в MySQL ведет себя не так, как ожидалось.

SET @natusort := 0;

SELECT id, title,  @natusort:=@natusort + 1 AS ordercount
FROM categories
JOIN table1 ON id = table1.parentid
ORDER BY title LIMIT 10

Я ожидал такого набора результатов:

ID  title   ordercount
------------------------------------
67  aaa     1   
23  aab     2
65  aac     3
47  aad     4
78  aba     5
32  abc     6
43  abd     7
33  aca     8
46  acb     9
12  acd     10

Но вместо этого я получил этот набор:

ID  title   ordercount
------------------------------------
67  aaa     12  
23  aab     3
65  aac     12
47  aad     34
78  aba     4
32  abc     36
43  abd     31
33  aca     15
46  acb     19
12  acd     50

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

Ответы [ 4 ]

2 голосов
/ 01 августа 2020

Вы можете использовать ROW_NUMBER(), например:

SELECT id, title,
  row_number() over(order by title) as ordercount
FROM categories
JOIN table1 ON id = table1.parentid
ORDER BY title 
LIMIT 10
1 голос
/ 01 августа 2020

Вы должны использовать row_number() в MySQL 8 +.

Проблема в том, что ORDER BY и GROUP BY несовместимы с переменными в более поздних версиях MySQL pre -8,0. Я точно не помню, когда это перестало работать, но я имею в виду GROUP BY перестал работать в 5.6 и ORDER BY в 5.7. I wi sh Я мог бы забыть о таких мелочах.

В любом случае решение - заказать в подзапросе:

SELECT tc.*, (@natusort := @natusort + 1) AS ordercount
FROM (SELECT id, title
      FROM categories c JOIN
           table1 t1
           ON c.id = t1.parentid
     ORDER BY title
    ) tc CROSS JOIN
    (SELECT @natusort := 0) params
ORDER BY title
LIMIT 10;

Обратите внимание, что я включил инициализацию @natusort в том же запросе, поэтому необходим только один оператор.

1 голос
/ 01 августа 2020

Похоже, здесь происходит то, что сначала ваша последовательность генерируется в наборе результатов, а затем вы ограничиваете до 10 записей в зависимости от порядка. То, что у вас осталось, не обязательно является последовательностью от 1 до 10. Лучшим решением здесь может быть использование ROW_NUMBER, если вы используете MySQL 8+. Если вы должны придерживаться вашего текущего подхода, перед генерацией последовательности оберните подзапрос:

SELECT id, title,  @natusort:=@natusort + 1 AS ordercount
FROM
(
    SELECT id, title
    FROM categories
    INNER JOIN table1 ON id = table1.parentid
    ORDER BY title
    LIMIT 10
) t
ORDER BY title;

Для параметра ROW_NUMBER просто измените свой выбор на:

SELECT id, title, ROW_NUMBER() OVER (ORDER BY title) AS ordercount
FROM categories
...
0 голосов
/ 01 августа 2020

Если использование SET @natusort := 0 в начале не работает, вы можете инициализировать его, используя пример объединения:

SELECT id, title, (@natusort:=@natusort + 1) AS ordercount
FROM categories
JOIN table1 ON id = table1.parentid
inner join (SELECT @natusort := 0)
ORDER BY title LIMIT 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...