ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค SQL ๊ณ ๋“์  kit - ๊ทธ๋ฃน๋ณ„ ์กฐ๊ฑด์— ๋งž๋Š” ์‹๋‹น ๋ชฉ๋ก ์ถœ๋ ฅํ•˜๊ธฐ
https://school.programmers.co.kr/learn/courses/30/lessons/131124#qna

๋ฌธ์ œ ์„ค๋ช…

: MEMBER_PROFILE์™€ REST_REVIEW ํ…Œ์ด๋ธ”์—์„œ ๋ฆฌ๋ทฐ๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์ž‘์„ฑํ•œ ํšŒ์›์˜ ๋ฆฌ๋ทฐ๋“ค์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ํšŒ์› ์ด๋ฆ„, ๋ฆฌ๋ทฐ ํ…์ŠคํŠธ, ๋ฆฌ๋ทฐ ์ž‘์„ฑ์ผ์ด ์ถœ๋ ฅ๋˜๋„๋ก ์ž‘์„ฑํ•ด์ฃผ์‹œ๊ณ , ๊ฒฐ๊ณผ๋Š” ๋ฆฌ๋ทฐ ์ž‘์„ฑ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋ฆฌ๋ทฐ ์ž‘์„ฑ์ผ์ด ๊ฐ™๋‹ค๋ฉด ๋ฆฌ๋ทฐ ํ…์ŠคํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”

ํ’€์ด ๊ณผ์ •

: ๋จผ์ € rest_review ํ…Œ์ด๋ธ”์„ member_id๋กœ group by ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ทธ๋ฃนํ™” ํ›„ ๊ทธ๋ฃน ๋‚ด row์˜ ์ˆ˜๋ฅผ ์„ธ์ฃผ์–ด ํŠน์ • ๋ฉค๋ฒ„๊ฐ€ ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ถ๊ธˆํ•œ ๊ฑด ์ตœ๋Œ€ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•œ ์‚ฌ๋žŒ์ด ๋ช‡ ๊ฐœ์˜ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”์ง€์ด๋ฏ€๋กœ ์ด๋•Œ max()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ order by๋ฅผ ํ†ตํ•ด ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ ํ›„ limit 1์œผ๋กœ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ดํ›„ ๋‹ค์‹œ rest_review ํ…Œ์ด๋ธ”์„ member_id๋กœ ๊ทธ๋ฃนํ™” ํ•  ๋•Œ having ์ ˆ์„ ํ†ตํ•ด ํ˜„์žฌ ๊ทธ๋ฃน์˜ count(*)์™€ ์•ž์„œ ๊ตฌํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ตœ๋Œ€ ๋ฆฌ๋ทฐ ์ˆ˜๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ ์ตœ๋Œ€ ๋ฆฌ๋ทธ๋ฅผ ์ž‘์„ฑํ•œ ๋ฉค๋ฒ„์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ

1. max๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

select m.member_name, r.review_text, date_format(r.review_date, '%Y-%m-%d')
from member_profile m, rest_review r
where m.member_id = r.member_id 
and m.member_id in (select r.member_id
                    from rest_review r
                    group by r.member_id
                    having count(*) = (
                        select max(cnt)
                        from (select member_id, count(*) cnt
                            from rest_review
                            group by member_id) as reviewCounts
                    ))
order by review_date, review_text

2. orderby + limit 1์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

select m.member_name, r.review_text, date_format(r.review_date, '%Y-%m-%d')
from member_profile m, rest_review r
where m.member_id = r.member_id 
and m.member_id in (select r.member_id
                    from rest_review r
                    group by r.member_id
                    having count(*) = (
                        select count(*)
                        from rest_review
                        group by member_id
                        order by count(*) desc
                        limit 1
                    ))
order by review_date, review_text
  • ์ตœ๋Œ€, ์ตœ์†Œ๋ฅผ ๊ตฌํ•  ๋•Œ๋Š” order by + limit์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ง๊ด€์ ์ธ ๊ฑฐ ๊ฐ™๋‹ค.

3. in์„ exist๋กœ ๋ณ€ํ™˜

select m.member_name, r.review_text, date_format(r.review_date, '%Y-%m-%d')
from member_profile m, rest_review r
where m.member_id = r.member_id 
and exists (select 1
            from rest_review r
            where r.member_id = m.member_id
            group by r.member_id
            having count(*) = (
                select max(cnt)
                from (select member_id, count(*) cnt
                    from rest_review
                    group by member_id) as reviewCounts
            ))
order by review_date, review_text
  • exist๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋น„๊ตํ•˜๋Š” ๊ฐ’๊ณผ ๊ฐ™์€ ๋น„๊ต๋˜๋Š” ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด ๋ฐ”๋กœ true๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  row๋ฅผ ์ˆœํšŒํ•ด์•ผ ํ•˜๋Š” in๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.
profile
๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฟˆ๊พธ๋Š” ํ•™์ƒ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€

Powered by GraphCDN, the GraphQL CDN