2013-05-14 47 views
0

你能幫我修改下面的SQL查詢,以便它能在mySQL中工作嗎?目前,錯誤消息是表t1不存在。我想獲得一個列「post_title」,「name1」,「url1」的表格。SQL查詢:如何正確分組項目?

如果有幫助那麼這個查詢可以在WordPress的測試CMS數據庫

SELECT t1.post_title, 
     (select meta_value from t1 where t1.meta_key='name1_class' limit 1) as name1, 
     (select meta_value from t1 where t1.meta_key='url1_class' limit 1) as url1 
    FROM (select pm.post_id as id, pm.meta_key, pm.meta_value, p.post_title, t.slug from wp_2_postmeta pm 
    inner join wp_2_posts p on pm.post_id = p.id 
    inner join wp_2_term_relationships tr on tr.object_id = p.id  
    inner join wp_2_term_taxonomy tt on tr.term_taxonomy_id = tt.term_taxonomy_id 
    inner join wp_2_terms t on t.term_id = tt.term_id 
    where post_type='footercolumn' and post_status='publish' and pm.meta_key like '%class') t1 

子查詢爲T1表中的「FROM」條款產生這樣的數據集:

'id', 'meta_key', 'meta_value', 'post_title', 'slug' 
'18', 'name1_class', 'Our Work', 'Who we are', 'column1' 
'18', 'url1_class', '/work.html', 'Who we are', 'column1' 
'18', 'name1_class', 'Our Team', 'About', 'column2' 
'18', 'url1_class', 'team.html', 'About', 'column2 

我想結果表是:

'title',  'name1',  'url1' 
'Who we are', 'Our Work', 'work.html' 
'About',  'Our Team', 'team.html' 

感謝

回答

0

看起來你正在嘗試使用子查詢來模擬CTE(公用表表達式),但我無法完全想到一種方法來完成這項工作。

好消息是,如果您可以使用聚合來查找數據,則不需要子查詢。

SELECT t1.post_title, 
     MAX(CASE WHEN meta_key='name1_class' THEN meta_value END) as name1, 
     MAX(CASE WHEN meta_key='url1_class' THEN meta_value END) as url1 
    FROM (select pm.post_id as id, pm.meta_key, pm.meta_value, p.post_title, t.slug 
     from wp_2_postmeta pm 
     inner join wp_2_posts p on pm.post_id = p.id 
     inner join wp_2_term_relationships tr on tr.object_id = p.id  
     inner join wp_2_term_taxonomy tt 
      on tr.term_taxonomy_id = tt.term_taxonomy_id 
     inner join wp_2_terms t on t.term_id = tt.term_id 
     where post_type='footercolumn' and post_status='publish' and pm.meta_key 
       like '%class') t1 
+1

正是我所需要的,非常感謝! – lekso 2013-05-14 10:07:34

0

我甚至不認爲你需要的子查詢,你可以重新加入postmeta表兩次獲得列和簡化查詢了一下:

SELECT  p.post_title 
      ,pma.meta_value AS name1 
      ,pmb.meta_value AS url1 

FROM  wp_2_posts p 

JOIN  wp_2_postmeta pma 
ON   p.ID = pma.post_id 
AND   pma.meta_key = 'name1_class' 

JOIN  wp_2_postmeta pmb 
ON   p.ID = pmb.post_id 
AND   pmb.meta_key = 'url1_class' 

JOIN  wp_2_term_relationships tr 
ON   tr.object_id = p.id 

JOIN  wp_2_term_taxonomy tt 
ON   tr.term_taxonomy_id = tt.term_taxonomy_id 

JOIN  wp_2_terms t 
ON   t.term_id = tt.term_id 

WHERE  p.post_type='footercolumn' 
AND   p.post_status='publish' 

如果由於某種原因,你有多個name1_class或每個帖子的url1_class值給重複post_title行,添加GROUP BY以消除。

GROUP BY post_title 

如果你遺漏值由於NULLname1_classurl1_class你可以糾正通過改變PMA/PMB的JOIN來LEFT OUTER JOININNER JOIN是默認的連接類型,所以在這種情況下無需指定INNER