하위 쿼리 mysql에 쿼리 제한을 추가하는 방법
SELECT kodeagent
, IFNULL((
SELECT COUNT(1)
FROM bsn_data
WHERE bsn_data.periode LIKE '2018-12-%%'
AND bsn_data.kodeupline2 = bsn_kode_agent.kodeagent
AND bsn_data.kodeagent IN(
SELECT bsn_data.kodeagent
FROM bsn_data
WHERE bsn_data.periode LIKE '2018-12-%%'
AND bsn_data.kodeupline2 = bsn_kode_agent.kodeagent
GROUP BY bsn_data.kodeagent ORDER BY COUNT(1) DESC LIMIT 1
)
), 0) AS totps
FROM bsn_kode_agent
WHERE fungsi = 'sales agent'
ORDER BY totps DESC
결과 얻기
이 버전의 MariaDB는 아직 'LIMIT & IN/ALL/ANY/SOME 하위 쿼리'를 지원하지 않습니다.
어떻게 해결하죠?하위 쿼리에 제한 쿼리 추가를 원합니다.감사합니다.
제 대답을 확인할 것이 없습니다.tmp 테이블 별칭(tmp_bsn_data)을 제공하기 위해 하위 쿼리를 다른 쿼리로 감쌌습니다.
SELECT kodeagent
, IFNULL((
SELECT COUNT(1)
FROM bsn_data
WHERE bsn_data.periode LIKE '2018-12-%%'
AND bsn_data.kodeupline2 = bsn_kode_agent.kodeagent
AND bsn_data.kodeagent IN( select tmp_bsn_data.kodeagent from (
SELECT bsn_data.kodeagent
FROM bsn_data
WHERE bsn_data.periode LIKE '2018-12-%%'
AND bsn_data.kodeupline2 = bsn_kode_agent.kodeagent
GROUP BY bsn_data.kodeagent ORDER BY COUNT(1) DESC LIMIT 1
) tmp_bsn_data
)
), 0) AS totps
FROM bsn_kode_agent
WHERE fungsi = 'sales agent'
ORDER BY totps DESC
효과가 있을 거라고 생각합니다.
SELECT ka.kodeagent
(SELECT COUNT(1)
FROM bsn_data d
WHERE d.periode >= '2018-12-01' AND
d.periode < '2019-01-01' AND
d.kodeupline2 = ka.kodeagent AND
d.kodeagent = (SELECT d2.kodeagent
FROM bsn_data d2
d2.periode >= '2018-12-01' AND
d2.periode < '2019-01-01' AND
d2.kodeupline2 = ka.kodeagent
GROUP BY d2.kodeagent
ORDER BY COUNT(1) DESC
LIMIT 1
)
) AS totps
FROM bsn_kode_agent ka
WHERE ka.fungsi = 'sales agent'
ORDER BY totps DESC;
주의:
- 날짜에 문자열 연산을 사용하지 마십시오!올바른 날짜 작업을 사용합니다.
- 테이블 별칭을 사용하고 테이블 이름을 한정합니다.
=
사용할 수 있습니다.limit
,비록 ~일지라도in
수 없다.COUNT()
돌아오지 않음NULL
그래서 그럴 필요가 없습니다.NULL
비교.
저는 여전히 쿼리가 작동하지 않을 것이라고 생각합니다. 왜냐하면 당신은 이중 중첩 상관 절을 가지고 있기 때문입니다.하지만 이것은 당신의 당면한 문제를 해결해줍니다.
그래도 문제가 해결되지 않으면 다른 질문을 하고 샘플 데이터, 원하는 결과 및 구현하려는 논리에 대한 설명을 제공합니다.
피하다IN ( SELECT ... )
이 경우, 그것을 쉽게 바꿀 수 있을 것입니다.JOIN
.
중간 쿼리를 변경합니다.
SELECT COUNT(1)
FROM bsn_data
WHERE bsn_data.periode LIKE '2018-12-%%'
AND bsn_data.kodeupline2 = bsn_kode_agent.kodeagent
AND bsn_data.kodeagent IN (
SELECT bsn_data.kodeagent
FROM bsn_data
WHERE bsn_data.periode LIKE '2018-12-%%'
AND bsn_data.kodeupline2 = bsn_kode_agent.kodeagent
GROUP BY bsn_data.kodeagent
ORDER BY COUNT(1) DESC
LIMIT 1
)
로.
SELECT COUNT(1)
FROM
( SELECT bsn_data.kodeagent
FROM bsn_data
WHERE bsn_data.periode >= '2018-12-01'
AND bsn_data.periode < '2018-12-01' + INTERVAL 1 MONTH
AND bsn_data.kodeupline2 = bsn_kode_agent.kodeagent
GROUP BY bsn_data.kodeagent
ORDER BY COUNT(1) DESC
LIMIT 1
) AS x
JOIN bsn_data ON x.kodeagent = bsn_data.kodeagent
WHERE bsn_data.periode >= '2018-12-01'
AND bsn_data.periode < '2018-12-01' + INTERVAL 1 MONTH
AND bsn_data.kodeupline2 = bsn_kode_agent.kodeagent
인덱스:
bsn_data: INDEX(kodeupline2, periode, kodeagent) -- in this order
bsn_data: (kodeagent) -- is this the PRIMARY KEY?
하지만 잠깐!그것을 간단히 말할 수 있습니까?
SELECT COUNT(1) AS ct
FROM bsn_data
WHERE bsn_data.periode >= '2018-12-01'
AND bsn_data.periode < '2018-12-01' + INTERVAL 1 MONTH
AND bsn_data.kodeupline2 = bsn_kode_agent.kodeagent
GROUP BY bsn_data.kodeagent
ORDER BY COUNT(1) DESC
LIMIT 1
MariaDB는 이를 위해 활용할 수 있는 "창 기능"을 제공합니다("상위 3개" 에이전트의 숫자만 입력해야 하는 것으로 보이는 이전 질문 참조).
CREATE TABLE bsn_kode_agent(
kodeagent VARCHAR(10) NOT NULL PRIMARY KEY
,fungsi VARCHAR(40) NOT NULL
);
INSERT INTO bsn_kode_agent(kodeagent,fungsi)
VALUES
('a','sales agent')
, ('b','sales agent');
CREATE TABLE bsn_data(
kodeagent VARCHAR(1) NOT NULL
,kodeupline2 VARCHAR(2) NOT NULL
,periode DATE NOT NULL
);
INSERT INTO bsn_data(kodeagent,kodeupline2,periode)
VALUES
('a','b1','2018-12-01')
, ('a','b1','2018-12-01')
, ('a','b1','2018-12-01')
, ('a','c1','2018-12-01')
, ('a','c1','2018-12-01')
, ('a','c1','2018-12-01')
, ('a','d1','2018-12-01')
, ('a','d1','2018-12-01')
, ('a','e1','2018-12-01')
, ('a','f1','2018-12-01')
;
SELECT b.kodeagent , IFNULL( SUM( d.total ), 0 ) AS totps FROM bsn_kode_agent AS b LEFT JOIN ( SELECT tableb.kodeupline2 , tableb.kodeagent , tableb.total , ROW_NUMBER() OVER (PARTITION BY tableb.kodeagent ORDER BY tableb.total DESC) as rn FROM ( SELECT bsn_data.kodeupline2 , bsn_data.kodeagent , COUNT( 1 ) total FROM bsn_data WHERE bsn_data.periode >= '2018-12-01' AND bsn_data.periode < '2018-12-01' + INTERVAL 1 MONTH GROUP BY bsn_data.kodeupline2 , bsn_data.kodeagent ) AS tableb ) d ON d.kodeagent = b.kodeagent and d.rn <=3 WHERE b.fungsi = 'sales agent' group by b.kodeagent ORDER BY totps DESC
코데제 | 팽이:-------- | ----:a | 8b | 0
아래: 독립 실행 시 하위 쿼리 결과입니다.참고로 그것은rn
열을 사용하면 카운트가 가장 높은 에이전트만 후속 필터링할 수 있습니다.
SELECT tableb.kodeupline2 , tableb.kodeagent , tableb.total , ROW_NUMBER() OVER (PARTITION BY tableb.kodeagent ORDER BY tableb.total DESC) as rn FROM ( SELECT bsn_data.kodeupline2 , bsn_data.kodeagent , COUNT( 1 ) total FROM bsn_data WHERE bsn_data.periode >= '2018-12-01' AND bsn_data.periode < '2018-12-01' + INTERVAL 1 MONTH GROUP BY bsn_data.kodeupline2 , bsn_data.kodeagent ) AS tableb
kodeuppline2 | kodeagent | 총 | rn:---------- | :-------- | ----: | -:b1 | a | 3 | 1c1 | a | 3 | 2d1 | a | 2 | 3e1 | a | 1 | 4f1 | a | 1 | 5
db<>여기로 이동
또한 샘플 데이터가 있는 것이 얼마나 유용한지 참고하시기 바랍니다. 하지만 제공되지 않았기 때문에 여기에 나와 있는 샘플에 대해 잘못된 가정을 했을 수 있습니다. 샘플 데이터가 질문과 함께 제공되는 것이 항상 더 좋습니다.
언급URL : https://stackoverflow.com/questions/53719242/how-to-add-query-limit-in-subs-query-mysql
'programing' 카테고리의 다른 글
PLS 오류 00363, Pl/SQL에서 텍스트 파일로 쓰는 방법 (0) | 2023.09.04 |
---|---|
C#과 Powershell로 무엇을 할 수 있습니까? (0) | 2023.09.04 |
팬더를 사용한 엑셀 쓰기 비율 (0) | 2023.09.04 |
mysql(오로라)에서 "Lock wait timeout exceeded"를 디버깅하는 방법 (0) | 2023.09.04 |
AWS RDS 동시 연결 문제 (0) | 2023.08.30 |