๐ข ๋ณธ ๊ฒ์๊ธ์์ ํ์ฉ๋๋ ๋ฌธ์ ์ ์ถ์ฒ๋ LEETCODE์์ ๋ฐํ๋๋ค.
๊ฐ๋จํ๊ฒ single number๋ง HAVING์ ์ COUNT()๋ก ์ธ๊ณ , MAX() ๋๋ ORDER BY & LIMIT ์กฐํฉ์ผ๋ก ํ๋ฉด ๋ ๊ฒ๊ฐ์ ๋ฌธ์ ๊ฐ ๋๊ด์ ๋ถ๋ชํ๋ ์ง์ ์ Example.2์ฒ๋ผ single number๊ฐ ์์ ๋, null์ ๋ฐํํ๋ ๊ฒ์ด๋ค.
์์ ๊ฐ์ด ๋ง์ฝ์ HAVING์ ๊ณผ ORDER BY, LIMIT๋ก ํ๋ฉด ์ฌ์ง์ฒ๋ผ ์ค๋ฅ๊ฐ ๋๋ค.
SELECT IF(COUNT(*) = 1, num, null) num
FROM mynumbers
GROUP BY num
HAVING COUNT(*) = 1
ORDER BY num DESC
LIMIT 1
์ค๋ฅ๋ฅผ ์์ ํ๊ธฐ ์ํด์๋ ์์ ์ฟผ๋ฆฌ์์ HAVING์ ์ ๋นผ์ผํ๋ค.
SQL์ฟผ๋ฆฌ๋ FROMโONโJOINโWHEREโGROUP BYโHAVINGโSELECTโDISTINCTโORDER BYโLIMIT ์ด ์์ผ๋ก ๋๊ธฐ ๋๋ฌธ์ HAVING์ ์์ COUNT(*) = 1์ธ row๋ง ๊ฑธ๋ฌ๋์ ์ํ์์ IF์ ์ ์กฐ๊ฑด์ single number๊ฐ ์๋ฏธ๊ฐ ์๋ ์กฐ๊ฑด์ด ๋๋ฒ๋ฆฐ๋ค(=์ซ์๋ NULL๋ ์ถ๋ ฅ๋์ง ์์).
๋ฐ๋ผ์, ์์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์์ ํ๋ ค๋ฉด HAVING์ ์ ์ ์ธํด์ผํ๊ณ , ๋ง์ฝ HAVING์ ์ฐ๊ณ ์ถ์ผ๋ฉด ์๋์ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ผ ํ๋ค.
SELECT MAX(num) as num
FROM (SELECT num
FROM mynumbers
GROUP BY num
HAVING COUNT(num) = 1
) AS single_numbers
์ ์ฟผ๋ฆฌ์์๋ ์๋ธ์ฟผ๋ฆฌ์์ HAVING์ ๋ก single numbers๋ฅผ ๋ค ๊ฑธ๋ฌ๋๊ณ , ๊ฑฐ๊ธฐ์ MAX()๋ฅผ ์ถ๋ ฅํ๋ ๋ฐฉ์์ด๋ค.
๋ง์ฝ, ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์๋ฌด๊ฒ๋ ์๋ค๋ฉด MAX()๋ NULL์ ์ถ๋ ฅํ๋ค.