열 순서 가있는 MySQL 테이블 섹션 이 있습니다 . 정렬 값 중 일부 는 숫자이며 상호 배타적이며 (두 숫자가 같지 않음) 다른 값은 단순 NULL 입니다.
예:
ID Ordering
-- --------
1 NULL
2 2
3 5
4 NULL
5 NULL
6 3
7 NULL
이제이 테이블을 정렬하고 다음 결과를 얻고 싶습니다.
(ROW NUMBER) ID Ordering
------------ -- -------- ------------
1 4 NULL
2 2 2
3 6 3
4 5 NULL
5 3 5
6 7 NULL
7 1 NULL
즉, NULL이 아닌 값을 가진 행이 주어진 순서 대로 나타나기를 원 하지만 NULL 값을 가진 행 은 무작위 순서로 (예측 불가능) 나머지 행에 나타나기를 원합니다 .
빈 공간을 채우기에 항상 충분한 NULL이 있다고 확신합니다.
먼저 주문이있는 항목 (WHERE ordering IS NOT NULL)을 얻은 다음 순서가없는 항목 (WHERE ordering IS NULL)을 얻은 다음 어떻게 든 NULL이있는 항목을 그렇지 않은 숫자로 변환하는 추가 열을 생성하는 것에 대해 생각하고있었습니다. t는 전자에 나타납니다.
어떤 도움이라도 대단히 감사하겠습니다. 위치가 고정 된 섹션이 있지만 다른 섹션은 임의의 순서를 갖도록 설정할 수있는 프로젝트에서 이것을 사용하고 있습니다. 페이지가로드 될 때마다 무작위 섹션이 무작위로 표시되어야합니다.
해결책을 찾았지만 다소 어색하고 큽니다. 그 이유를 설명하겠습니다.
이제 SQL은 다음과 같습니다.
SELECT row_number, id
FROM (
SELECT @curRow2 := @curRow2 + 1 AS row_number2, row_number
FROM (
SELECT @curRow := @curRow + 1 AS row_number
FROM Sections
JOIN (SELECT @curRow := 0) r
) all_rows
JOIN (SELECT @curRow2 := 0) r
WHERE all_rows.row_number NOT IN (
SELECT ordering
FROM Sections
WHERE ordering IS NOT NULL
)) unused_row_numbers,
(
SELECT @curRow3 := @curRow3 + 1 AS row_number3, id
FROM (
SELECT ordering, id
FROM Sections
WHERE ordering IS NULL
ORDER BY RAND()
) randomized_nulls
JOIN (SELECT @curRow3 := 0) r
) nulls_with_row_numbers
WHERE unused_row_numbers.row_number2 = nulls_with_row_numbers.row_number3
UNION
SELECT ordering AS row_number, id
FROM Sections
WHERE ordering IS NOT NULL
ORDER BY row_number
매번 다른 결과를 제공합니다. 결과 예 :
ROW_NUMBER ID
---------- --
1 1 (random)
2 2 (always second position)
3 6 (always third position)
4 4 (random)
5 3 (random)
6 5 (always sixth position)
7 7 (random)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다