2014-10-07 126 views
0

一如既往感謝您提前給予的幫助。我被困在這個幾天,無法擺脫它。最後一次在這裏發佈信息。SQL語句使用Like和Like來調用object_id - 不是或

我想要實現 - 抓住所有的object_id同時匹配「家」和「夜總會」

這涉及到3個表聯接以達到

WP_2_TERMS 
-------------------------------------------------------- 
term_id | name | slug | term_group | 
    3   nightclub  nightclub  0 
    41   house  house-3   0 
-------------------------------------------------------- 

WP_2_TAXONOMY 
------------------------------------------------------- 
term_taxonomy_id | term_id | taxonomy | 
     3     3   category 
     42     41   Music 
------------------------------------------------------- 

WP_2_TERM_RELATIONSHIPS 
------------------------------------------------------- 
object_id | term_taxonomy_id | term_order | 
    13     4      0 
    13     42     0 
    65     3      0 
    65     42     0 
    111     3     0 

------------------------------------------------------- 

因此理想情況下,SQL會輸出只是object_id 65 ,但目前它返回0行

到目前爲止,這是我的。任何人都可以看到我做錯了什麼,並謹慎解釋嗎?

SELECT `rel`.`object_id` 
    FROM `wp_2_term_relationships` as `rel` 
    INNER JOIN `wp_2_term_taxonomy` as `tax` ON rel.term_taxonomy_id = tax.term_taxonomy_id 
    LEFT JOIN `wp_2_terms` as `terms` ON tax.term_id = terms.term_id 
    LEFT JOIN `wp_2_terms` as `terms2` ON tax.term_id = terms2.term_id 
    WHERE terms.name LIKE '%house% AND terms2.name LIKE '%nightclub%' 

而且,是的,我知道這可能是與wp_query做,但我是從WordPress的遷移遠所以很遺憾的時刻,這是最好的解決辦法!

回答

1

您遇到的問題是,即使你加入表wp_2_terms兩次,要加入到相同的列(tax.term_id),因此terms.name永遠是一樣terms2.name,而因爲這些會同樣他們不能同時爲nightclubhouse

這個標準的方法是使用GROUP BY/HAVING

SELECT rel.object_id 
FROM wp_2_term_relationships AS rel 
     INNER JOIN wp_2_term_taxonomy AS tax 
      ON rel.term_taxonomy_id = tax.term_taxonomy_id 
     INNER JOIN wp_2_terms AS terms 
      ON tax.term_id = terms.term_id 
WHERE terms.Name IN ('house', 'nightclub') 
GROUP BY rel.object_id 
HAVING COUNT(DISTINCT terms.Name) > 1; 

如果使用LIKE是強制性的,而不是簡單的等於,你可以重寫:

SELECT rel.object_id 
FROM wp_2_term_relationships AS rel 
     INNER JOIN wp_2_term_taxonomy AS tax 
      ON rel.term_taxonomy_id = tax.term_taxonomy_id 
     INNER JOIN wp_2_terms AS terms 
      ON tax.term_id = terms.term_id 
WHERE terms.Name LIKE '%house%' 
OR  terms.Name LIKE '%nightclub%' 
GROUP BY rel.object_id 
HAVING COUNT(CASE WHEN terms.Name LIKE '%house%' THEN 1 END) >= 1 
AND  COUNT(CASE WHEN terms.Name LIKE '%nightclub%' THEN 1 END) >= 1; 
+0

THANKYOU !!我感謝您花時間不僅回答我的問題,而且解釋方法! +1 – bossbowser 2014-10-07 12:30:33

+0

也@GarethD如果我想這反向運行,因爲我有object_ID但想找到terms.Name我將如何重組此? - 提前致謝 – bossbowser 2014-10-07 13:44:07

0

我覺得應該夠了。

SELECT `rel`.`object_id` 
FROM 
    `wp_2_term_relationships` as `rel` 
LEFT OUTER JOIN 
    `wp_2_term_taxonomy` as `tax` ON rel.term_taxonomy_id = tax.term_taxonomy_id 
LEFT OUTER JOIN 
    `wp_2_terms` as `terms` ON tax.term_id = terms.term_id 
WHERE 
    terms.name LIKE '%house%' 
AND 
    terms.name LIKE '%nightclub%' 
+0

感謝您的幫助@kmas但仍它返回ZERO行:/ – bossbowser 2014-10-07 11:56:38

+0

可以肯定,wp_2_term_taxonomy和WP_2_TAXONOMY是同一個表...? – kmas 2014-10-07 11:58:55

+0

它們是不同的表格。總的來說有3個表格。 wp_2_terms - wp_2_taxonomy - wp_2_terms_relationships – bossbowser 2014-10-07 12:07:43