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] 삭제
몇 마디 만하겠습니다