복잡한 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
'programing' 카테고리의 다른 글
CSS: 글꼴 크기 100% - 무엇의 100%? (0) | 2023.10.24 |
---|---|
XML 네임스페이스의 용도는 무엇입니까? (0) | 2023.10.24 |
Android에서 RxJava를 사용할 시기 및 Android Architectural Components의 LiveData를 사용할 시기는? (0) | 2023.10.24 |
"IIS Express 웹 서버를 시작할 수 없습니다" 오류 (0) | 2023.10.24 |
비AJAX jQuery POST 요청 (0) | 2023.10.24 |