2009-11-06 134 views
4

我在wordpress中創建了一個網站,該網站擁有關於電視節目的信息。我正在使用自定義字段來選擇每個帖子。複雜的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  | 
+----+---------+----------+------------+ 

基本上我需要做的是選擇所有電視的顯示名稱爲「超人前傳」和季節然後通過集排序。我認爲這將是相當簡單的,但我所嘗試的一切都沒有返回。

請問您能解釋我該如何做到這一點?

+1

您是否可以控制數據庫以重新設計爲更普通的格式?或者這是不可能的? – dustmachine 2009-11-06 21:59:00

+0

爲什麼哦爲什麼你會使用這樣的表格格式? – 2009-11-06 22:14:24

+0

不幸的是不是Dustmachine,我使用Wordpress。 – 2009-11-06 23:30:27

回答

11

你可以做這樣的事情:

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 
+1

@Lukasz - 你有一個小錯誤 - SELECT列表應該是:t1.post_id,t1.meta_value AS name,t2.meta_value AS season,t3.meta_value AS episode。 – 2009-11-06 22:34:44

+0

哦,你說得對!謝謝。 – 2009-11-06 22:38:47

2

一個更一般的情況:從格式到一個比較正常的關係數據庫格式轉換排序的:

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, 
7

使用自聯接合並行,你是好去:

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 
+0

不錯的作品Andomar。將其轉換爲另一個示例: http://codex.wordpress。org/Function_Reference/wpdb_Class#SELECT_a_Column – Michael 2009-11-07 14:52:48

1

的想法是將表與自身3倍,其中對於每個人採取行對於給定meta_key:

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 
2

不需要做直接的SQL。 您可以通過WP_Query對象訪問SQL查詢。查看圍繞WP_Query對象中where子句的過濾器(有多種方法可以獲取它),並簡單地修改默認WP_Query部分,然後將它們連接在一起。

開始通過設置WP_Query對象,通過postmeta鍵& postmeta價值得到所有的帖子,然後在一個多一點釘where子句做一些額外的條件語句。

還有另一個過濾器,它允許您訪問SQL查詢的排序部分,以便您可以對其進行修改。

沒有理由在這裏手寫SQL,只需修改已爲您構建的內容即可。