컴퓨터 활용/노년에 즐기는 코딩

[MySQL] 100편의 시를 모으기까지

easyfly 2025. 10. 4. 12:59
반응형

터미널에서 명령어 구조: mysql -H -u [사용자명] -p -D madang -e "..." > poems.html


명령어 구성 요소 설명

  • mysql: MariaDB 또는 MySQL 데이터베이스 클라이언트를 실행하는 명령어입니다.
  • -H (또는 --html): 쿼리의 출력(Output)을 HTML <table> 형식으로 만들라는 옵션입니다. 이 옵션이 가장 핵심적인 부분입니다.
  • -u [사용자명]: 데이터베이스에 접속할 사용자 계정(User)을 지정하는 옵션입니다. [사용자명] 부분에 실제 DB 계정 이름을 입력합니다.
  • -p: 비밀번호(Password)를 입력하겠다는 옵션입니다. 명령어를 실행하면 비밀번호를 묻는 프롬프트가 나타나 안전하게 입력할 수 있습니다.
  • -D madang: 접속할 데이터베이스(Database)madang으로 지정하는 옵션입니다.
  • -e "...": 실행할(Execute) SQL 쿼리를 지정하는 옵션입니다. 터미널에서 바로 쿼리를 실행하며, "..." 안에 실행하고 싶은 전체 SQL 문장을 넣습니다.
  • >: 리디렉션(Redirection) 기호입니다. 좌측에 있는 명령어의 실행 결과를 화면에 출력하는 대신, 우측에 지정된 파일에 저장하라는 의미입니다.
  • poems.html: 결과를 저장할 파일 이름입니다. 이 경우 poems.html이라는 이름의 HTML 파일이 생성됩니다.

전체 흐름 요약 ➡️

요약하자면, 이 명령어는 "madang 데이터베이스에 [사용자명]으로 접속하여, "..." 안의 SQL 쿼리를 실행한 뒤, 그 결과를 HTML 테이블로 변환하여 poems.html 파일에 저장하라"는 의미입니다.

 

SQL 쿼리

WITH QualifyingPoets AS (
    -- 1단계: 10편 이상 시를 쓴 시인들의 id를 찾고, 그 중 11명을 무작위로 고릅니다.
    SELECT
        poet_id
    FROM
        poem_poem
    GROUP BY
        poet_id
    HAVING
        COUNT(*) >= 10
    ORDER BY
        RAND()
    LIMIT 11 -- 이 부분을 10에서 11로 수정했습니다.
),
RankedPoems AS (
    -- 2단계: 위에서 고른 시인들의 모든 작품에 대해, 시인별로 무작위 순번을 매깁니다.
    SELECT
        p.title,
        p.content,
        p.poet_id,
        ROW_NUMBER() OVER (PARTITION BY p.poet_id ORDER BY RAND()) as rn
    FROM
        poem_poem p
    JOIN
        QualifyingPoets qp ON p.poet_id = qp.poet_id
)
-- 3단계: 시인별로 매겨진 순번이 10번 이하인 작품만 선택하여 총 110편을 만듭니다.
SELECT
    rp.title AS '제목',
    po.name AS '시인',
    rp.content AS '본문'
FROM
    RankedPoems rp
JOIN
    poem_poet po ON rp.poet_id = po.id
WHERE
    rp.rn <= 10;

선택된 시 100편

정리

1000편의 시에서 10편 이상 작성된 시인을 선택하여 각 10편의 시를 뽑아내는 작업을 MySQL 언어로 쉽게 할 수 있는 방법이었습니다. 이 코딩을 시마당에 적용하면 앞으로 여러 변용된 방법 사용이 가능할 것 같습니다.

반응형