행 번호 매기기 (@i : = @i + 1)가 예상대로 작동하지 않습니다.

사용자 4087080
SET @i := 0;
SELECT posts.post_id,
       members.member_joined,
       @i := @i + 1
FROM   posts LEFT JOIN members
             ON posts.member_id = members.member_id
WHERE posts.topic_id = 1
ORDER BY posts.post_created ASC;

해당 쿼리는 다음 결과 집합을 반환합니다.

+---------+---------------------+--------------+
| post_id | member_joined       | @i := @i + 1 |
+---------+---------------------+--------------+
|       1 | 2014-10-14 20:28:15 |            1 |
+---------+---------------------+--------------+
|       3 | 2014-10-14 20:28:15 |            4 |
+---------+---------------------+--------------+
|       4 | 2014-10-14 20:28:15 |            5 |
+---------+---------------------+--------------+
|       5 | 2014-10-14 20:28:15 |            6 |
+---------+---------------------+--------------+
|      14 | 2014-10-14 20:28:15 |            7 |
+---------+---------------------+--------------+
|      17 | 2014-10-14 20:28:15 |            8 |
+---------+---------------------+--------------+
|      35 | 2014-10-14 20:28:15 |            9 |
+---------+---------------------+--------------+
|      37 | 2014-10-14 20:28:15 |            2 | -- What's the 2 doing down here?
+---------+---------------------+--------------+
|      42 | 2014-10-14 20:28:15 |            3 | -- Ditto.
+---------+---------------------+--------------+

보시다시피, 나에게 알려지지 않은 이유 때문에 숫자 2와 3은 결과 세트의 맨 아래에 표시되지만 그렇게해서는 안됩니다.

다음 과 같이 members.member_joined 줄을 주석 처리하면 :

SET @i := 0;
SELECT posts.post_id,
       -- members.member_joined,
       @i := @i + 1
FROM   posts LEFT JOIN members
             ON posts.member_id = members.member_id
WHERE posts.topic_id = 1
ORDER BY posts.post_created ASC;

이제 결과 세트는 예상대로입니다.

+---------+--------------+
| post_id | @i := @i + 1 |
+---------+--------------+
|       1 |            1 |
+---------+--------------+
|       3 |            2 |
+---------+--------------+
|       4 |            3 |
+---------+--------------+
|       5 |            4 |
+---------+--------------+
|      14 |            5 |
+---------+--------------+
|      17 |            6 |
+---------+--------------+
|      35 |            7 |
+---------+--------------+
|      37 |            8 |
+---------+--------------+
|      42 |            9 |
+---------+--------------+

나는 이것에 내 머리를 감쌀 수 없다. 무엇이 잘못 되었을까요?

존 러델

대부분의 경우 주문 기준으로 인해 카운트가 해제됩니다. ORDER BY는 선택이 완료된 후 실행되므로 카운트를 다시 정렬 할 수 있습니다. 하위 쿼리에 넣어보십시오.

SET @i := 0;
SELECT post_id, member_joined, @i := @i + 1
FROM
(   SELECT p.post_id, m.member_joined
    FROM posts p
    LEFT JOIN members m ON p.member_id = m.member_id
    WHERE p.topic_id = 1
    ORDER BY p.post_created ASC
)t;

이런 식으로 생각해보십시오. SELECT to WHERE는 테이블에서 가져옵니다. 따라서 특정 요구 사항은 WHERE에있을 수 있습니다. GROUP BY 끝은 요청이 완료된 후 반환 된 결과를 변경합니다. .. 그래서 order by로 인해 문제가 발생할 수 있습니다 ... select에 가입 한 구성원을 포함하면 날짜별로 계산 된 결과가 반환됩니다.

노트:

MySQL DOCS 는 이에 대해 매우 명확합니다.

일반적으로 사용자 변수에 값을 할당하고 동일한 문 내에서 값을 읽어서는 안됩니다. 예상 한 결과를 얻을 수 있지만 보장되지는 않습니다. 사용자 변수를 포함하는 표현식에 대한 평가 순서는 정의되지 않았으며 주어진 문에 포함 된 요소에 따라 변경 될 수 있습니다. 또한이 순서는 MySQL 서버 릴리스간에 동일하지 않을 수도 있습니다. SELECT @a, @a : = @ a + 1, ...에서 MySQL이 @a를 먼저 평가 한 다음 두 번째 할당을 수행한다고 생각할 수 있습니다. 그러나 문을 변경하면 (예 : GROUP BY, HAVING 또는 ORDER BY 절을 추가하여) MySQL이 평가 순서가 다른 실행 계획을 선택할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Python : 번호 매기기가 예상대로 작동하지 않습니다.

분류에서Dev

암호 검사기가 예상대로 작동하지 않습니다.

분류에서Dev

예상대로 비동기가 작동하지 않습니다.

분류에서Dev

for i in var 문이 예상대로 작동하지 않습니다.

분류에서Dev

SFINAE 경기가 예상대로 진행되지 않습니다

분류에서Dev

행 범위가 두 번째 행에서 예상대로 작동하지 않습니다.

분류에서Dev

Git 분기가 예상대로 작동하지 않습니다.

분류에서Dev

기호 가시성이 예상대로 작동하지 않음

분류에서Dev

UIpickerView가 매개 변수 행 번호로 작동하지 않음

분류에서Dev

(React & Mobx & Leaflet) 기다렸다가 예상대로 작동하지 않습니다.

분류에서Dev

읽기 소켓 및 암기가 예상대로 작동하지 않습니다.

분류에서Dev

VB의 비동기가 예상대로 작동하지 않습니다.

분류에서Dev

UITableViewController의 행 번호가 프로토콜 기능을 따르지 않습니다.

분류에서Dev

grep regex 대괄호가 예상대로 작동하지 않습니다.

분류에서Dev

C의 빈 파일 읽기가 예상대로 작동하지 않습니다.

분류에서Dev

gulp 이름 바꾸기가 예상대로 작동하지 않습니다.

분류에서Dev

Python의 생성기가 예상대로 작동하지 않습니다.

분류에서Dev

img srcset 및 크기가 예상대로 작동하지 않습니다.

분류에서Dev

onBeforeUnload가 갑자기 예상대로 작동하지 않습니다.

분류에서Dev

소스 건너 뛰기가 예상대로 작동하지 않습니다.

분류에서Dev

JSoup "wrap"이 매번 예상대로 작동하지 않습니다.

분류에서Dev

번호가 매겨진 헤더 값을 동적으로 읽기 위해 중첩 된 EL을 사용하면 더 이상 작동하지 않습니다.

분류에서Dev

식의 매크로가 예상대로 작동하지 않습니다.

분류에서Dev

Variadic 매크로 인수 수가 예상대로 작동하지 않습니다.

분류에서Dev

기능이 제대로 작동하지 않습니다. 표시하면 안되는 추가 번호

분류에서Dev

MS 워드 자동 번호 매기기가 1에서 다시 시작되지 않습니다.

분류에서Dev

Word에서 페이지 번호가 예상대로 작동하지 않음

분류에서Dev

그리드 템플릿 열이 예상대로 작동하지 않습니다. 일부 행에 공백 가져 오기

분류에서Dev

WebdriverIO에서 대기 매개 변수가있는 '예상'기능이 작동하지 않습니다.

Related 관련 기사

  1. 1

    Python : 번호 매기기가 예상대로 작동하지 않습니다.

  2. 2

    암호 검사기가 예상대로 작동하지 않습니다.

  3. 3

    예상대로 비동기가 작동하지 않습니다.

  4. 4

    for i in var 문이 예상대로 작동하지 않습니다.

  5. 5

    SFINAE 경기가 예상대로 진행되지 않습니다

  6. 6

    행 범위가 두 번째 행에서 예상대로 작동하지 않습니다.

  7. 7

    Git 분기가 예상대로 작동하지 않습니다.

  8. 8

    기호 가시성이 예상대로 작동하지 않음

  9. 9

    UIpickerView가 매개 변수 행 번호로 작동하지 않음

  10. 10

    (React & Mobx & Leaflet) 기다렸다가 예상대로 작동하지 않습니다.

  11. 11

    읽기 소켓 및 암기가 예상대로 작동하지 않습니다.

  12. 12

    VB의 비동기가 예상대로 작동하지 않습니다.

  13. 13

    UITableViewController의 행 번호가 프로토콜 기능을 따르지 않습니다.

  14. 14

    grep regex 대괄호가 예상대로 작동하지 않습니다.

  15. 15

    C의 빈 파일 읽기가 예상대로 작동하지 않습니다.

  16. 16

    gulp 이름 바꾸기가 예상대로 작동하지 않습니다.

  17. 17

    Python의 생성기가 예상대로 작동하지 않습니다.

  18. 18

    img srcset 및 크기가 예상대로 작동하지 않습니다.

  19. 19

    onBeforeUnload가 갑자기 예상대로 작동하지 않습니다.

  20. 20

    소스 건너 뛰기가 예상대로 작동하지 않습니다.

  21. 21

    JSoup "wrap"이 매번 예상대로 작동하지 않습니다.

  22. 22

    번호가 매겨진 헤더 값을 동적으로 읽기 위해 중첩 된 EL을 사용하면 더 이상 작동하지 않습니다.

  23. 23

    식의 매크로가 예상대로 작동하지 않습니다.

  24. 24

    Variadic 매크로 인수 수가 예상대로 작동하지 않습니다.

  25. 25

    기능이 제대로 작동하지 않습니다. 표시하면 안되는 추가 번호

  26. 26

    MS 워드 자동 번호 매기기가 1에서 다시 시작되지 않습니다.

  27. 27

    Word에서 페이지 번호가 예상대로 작동하지 않음

  28. 28

    그리드 템플릿 열이 예상대로 작동하지 않습니다. 일부 행에 공백 가져 오기

  29. 29

    WebdriverIO에서 대기 매개 변수가있는 '예상'기능이 작동하지 않습니다.

뜨겁다태그

보관