programing

복잡한 MySQL 쿼리

bestprogram 2023. 10. 24. 21:30

복잡한 MySQL 쿼리

저는 워드프레스로 텔레비전 프로그램에 대한 정보를 저장하는 사이트를 만들고 있습니다.각 게시물을 선택하기 위해 사용자 지정 필드를 사용하고 있습니다.

그 테이블은 이렇게 생겼습니다.

+----+---------+----------+------------+
| id | post_id | meta_key | meta_value |
+----+---------+----------+------------+
| 1  |    1    |   name   | Smallville |
| 2  |    1    |  season  |     1      |
| 3  |    1    |  episode |     1      |
| 4  |    2    |   name   | Smallville |
| 5  |    2    |  season  |     1      |
| 6  |    2    |  episode |     2      |
+----+---------+----------+------------+

기본적으로 제가 해야 할 일은 '스몰빌'이라는 이름을 가진 모든 TV 프로그램을 선택해서 시즌별, 에피소드별로 분류하는 것입니다.꽤 간단할 거라고 생각했는데 제가 시도한 것은 아무것도 돌려주지 않습니다.

제가 어떻게 해야 하는지 설명해주시겠습니까?

다음과 같은 작업을 수행할 수 있습니다.

SELECT 
    t1.post_id, 
    t1.meta_value AS name, 
    t2.meta_value AS season, 
    t3.meta_value AS episode
FROM
    (
    SELECT *
    FROM the_table
    WHERE meta_key = 'name'
    ) t1
INNER JOIN
    (
    SELECT *
    FROM the_table
    WHERE meta_key = 'season'
    ) t2 ON t1.post_id = t2.post_id
INNER JOIN
    (
    SELECT *
    FROM the_table
    WHERE meta_key = 'episode'
    ) t3 ON t1.post_id = t3.post_id

이렇게 하면 다음과 같은 결과를 얻을 수 있습니다.

| post_id | name       | season | episode |
-------------------------------------------
|    1    | Smallville | 1      | 1       |
|    2    | Smallville | 1      | 2       |

이러한 형태로 작업을 수행하는 것이 훨씬 더 쉽습니다.

추가해야 할 사항은 다음과 같습니다.

WHERE name = 'Smallville'
ORDER BY season, episode

자기 결합을 이용해 열을 결합하면 됩니다.

SELECT      *
FROM        yourtable name
INNER JOIN  yourtable season 
            on season.post_id = name.post_id
            and season.meta_key = 'season'
INNER JOIN  yourtable episode
            on episode.post_id = name.post_id
            and episode.meta_key = 'episode'
WHERE       name.meta_key = 'name'
            and name.meta_value = 'Smallville'
ORDER BY    season.meta_value, episode.meta_value

보다 일반적인 경우: 형식에서 보다 일반적인 관계형 DB 형식으로의 변환:

SELECT (SELECT meta_value FROM data t1 WHERE t1.post_id = t0.post_id AND meta_key = "season") AS season,
   (SELECT meta_value FROM data t1 WHERE t1.post_id = t0.post_id AND meta_key = "episode") AS episode
FROM data t0 WHERE meta_key = "name" AND meta_value = "Smallville"

실제 정렬의 경우 시즌/에피소드 값(정렬 중에 아직 할당되지 않음)을 재사용할 수 없으므로 하위 쿼리를 ORDER BY 절에 복사/붙여넣어야 합니다.

ORDER BY (SELECT ... "season") ASC, (SELECT ... "episode") ASC, 

직접 SQL을 수행할 필요가 없습니다.WP_Query 개체를 통해 SQL 쿼리에 액세스할 수 있습니다.WP_Query 객체의 where 절(where 절)을 둘러싼 필터를 확인하고 기본 WP_Query 부분을 연결하기 전에 수정하기만 하면 됩니다.

postmeta key & postmeta 값으로 모든 게시물을 얻는 WP_Query 객체를 설정하는 것부터 시작하여 where 절에 조금 더 붙여서 추가 조건을 수행합니다.

SQL 쿼리의 주문 섹션을 얻을 수 있는 다른 필터가 있으므로 수정할 수 있습니다.

여기서 SQL을 직접 작성할 필요는 없고, 이미 구축된 내용만 수정하면 됩니다.

이 아이디어는 주어진 meta_key에 대해 행을 취하는 테이블을 자신에게 3번 결합하는 것입니다.

SELECT t1.meta_value name, t2.meta_value season, t3.meta_value episode
FROM table t1
JOIN table t2 on t1.post_id = t2.post_id and t2.meta_key = 'season'
JOIN table t3 on t1.post_id = t3.post_id and t3.meta_key = 'episode'
WHERE t1.meta_key = 'name'
  AND t1.meta_value = 'Smallville'
ORDER BY t2.meta_value, t3.meta_value

언급URL : https://stackoverflow.com/questions/1690762/complicated-mysql-query