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
대신.
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
'programing' 카테고리의 다른 글
null 값 식에서 메서드를 호출할 수 없습니다. (0) | 2023.08.20 |
---|---|
RecyclerView를 사용하여 빈 보기를 표시하는 방법은 무엇입니까? (0) | 2023.08.20 |
jQuery로 현재 시간을 얻는 방법 (0) | 2023.08.20 |
Angular2의 ngIf 변수 유형 확인 방법 (0) | 2023.08.20 |
VBA를 사용하여 MS-Excel(2010)에서 MS-Access Table을 쿼리하는 방법 (0) | 2023.08.20 |