programing

MySQL: penult 값 선택

starjava 2023. 8. 20. 10:10
반응형

MySQL: penult 값 선택

두 개의 테이블이 있습니다.

표 1:

id  |phone| order|
 ---|-----|------|
  1 | 122 |  6   |
  2 | 122 |  4   |
  3 | 122 |  3   |
  4 | 123 |  6   |
  5 | 123 |  5   |
  6 | 123 |  3   |   
  7 | 124 |  6   |
  8 | 124 |  5   |
  9 | 125 |  6   |
  10| 125 |  5   |

표 2:

|phone |
|------|
|122   |
|123   |
|124   |

다음 조건에 따라 id와 last order를 선택해야 합니다.

  • 주문이 3과 같지 않으면 이 전화기의 최대 ID 값을 가진 행을 선택합니다.
  • 주문이 3개일 경우 이 전화기의 Pre-max id를 사용합니다.
  • ID는 표 2에 있습니다.

따라서 결과는 다음과 같습니다.

|phone  | order|
|------ |------|
|122    | 4    |
|123    | 5    |
|124    | 5    |

MySQL 버전:Ver 15.1 분포 5.5.64-마리아DB

기본적으로 마지막 두 레코드를 확인합니다. 마지막 레코드에 순서가 있는 경우3그런 다음 이전 것을 사용합니다.

이전 MySQL 버전은 이러한 기능을 지원하지 않기 때문에 창 기능 및/또는 가로 방향 조인이 포함된 간단한 쿼리였을 것입니다.nbk에서 설명한 것처럼 사용자 변수는 옵션이지만 사용하기가 까다롭습니다. MySQL 8.0은 이 기능이 향후 버전에서 더 이상 사용되지 않을 것이라고 발표했습니다.

저는 상관된 하위 질의와 약간의 논리를 추천하려고 합니다.

select t2.id,
    coalesce(
        nullif((select ord from table1 t1 where t1.id = t2.id order by odering_id desc limit 1), 3),
        (select ord from table1 t1 where t1.id = t2.id order by odering_id desc limit 1, 1)
    ) as ord
from table2 t2

첫 번째 하위 쿼리는 최신 값을 가져옵니다.nullif()반환된 값을 확인하고 반환합니다.null순서가 있으면3이것이 시사하는 바는coalesce()이전 값을 얻는 두 번째 하위 쿼리의 결과를 반환해야 합니다.

order언어 키워드이기 때문에 사용했습니다.ord대신.

MySQL 5.5에서의 데모:

id | ord--: | --:122 |   4123 |   5124 |   5

당신의 mariadb 버전은 조금 오래되었습니다.

Thta는 다음을 기준으로 정렬된 행 번호를 사용합니다.order열을 선택하면 두 번째 열만 선택됩니다.

mariadb는 표준을 따르고 하위 선택을 정렬하지 않기 때문에 하위 쿼리의 LIMIT가 필요합니다.

CREATE TABLE Table1
    (`id` int, `order` int)
;
    
INSERT INTO Table1
    (`id`, `order`)
VALUES
    (122, 6),
    (122, 4),
    (122, 3),
    (123, 6),
    (123, 5),
    (123, 3),
    (124, 6),
    (124, 5),
    (125, 6),
    (125, 5)
;
CREATE TABLE Table2
    (`id` int)
;
    
INSERT INTO Table2
    (`id`)
VALUES
    (122),
    (123),
    (124)
;
SELECT id,`order`
FROM (SELECT 

 t1.`order`
, IF ( @id = t1.id ,@rn := @rn +1, @rn:= 1) AS rownum
, @id := t1.`id` as id
FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id,(SELECT @id := 0,@rn := 0) t3
ORDEr BY t1.id,t1.`order` DESC LIMIT 18446744073709551615) t4
WHERE rownum = 2
    
id | ord--: | ----:122 |     4123 |     5124 |     5

db<>여기로 이동

언급URL : https://stackoverflow.com/questions/65411228/mysql-select-penult-values

반응형