2015-09-27 54 views
1

我必須修改Wordpress站點內的mySql自定義查詢。 我會盡力向你解釋我的問題,簡化查詢,這真的需要知道。帶有AND和OR(包含和排除子句)的HAVING COUNT(DISTINCT)的mySql查詢

cms_posts(別名 'P')是INNER接合到cms_term_relationship表(變體 'term_rel')。
我想找到所有cms_poststerm_rel.term_taxonomy值包括IN 211,210,10,9。
我當前的查詢是:

SELECT SQL_CALC_FOUND_ROWS 
    p.id 
FROM cms_posts p 
    INNER JOIN cms_term_relationships term_rel 
     ON term_rel.object_id = p.id 
WHERE 
    term_rel.term_taxonomy_id IN (211,210,10,9) 
GROUP BY p.id 
HAVING 
    COUNT(DISTINCT term_rel.term_taxonomy_id) = 4 
LIMIT 0, 50 

COUNT(DISTINCT確保所有的關係我在WHERE子句striclty跟着問

它所有的工作完美無瑕

但我。需要修改查詢!
我需要拆分WHERE子句。我試着做一個例子。

我需要與term_taxonomy所有帖子在211 210,而且在10 OR 9.
我搜索信息的所有這些組合:
211,210,10
211,210,9
所以我需要211和210 都需要,但只有一次發生10 9也是需要的。

很好,我需要我的帖子在X,Y,Z類別,至少在A,B或C類別。 X,Y,Z類別是獨一無二的; A,B,C是包容性的。

這個問題並不那麼容易解釋,而我可怕的英語並沒有幫助。
我希望有人瞭解我的英語,甚至我的問題:D

+0

你需要提供這些表的架構,因爲所有這些都可能不知道wordpress是如何工作的 – ddw147

回答

0

感謝Mureinik的答案,但如果我嘗試實現您的代碼,使用case表達式似乎不起作用。如果我理解你的目標,那麼所有的'包容性術語',但第一個,都沒有被COUNT考慮過(DISTINCT。我可能沒有以正確的方式實現你的代碼,但結果並不好。足夠

但也許我有一個解決方案 讓我試着給你一個更好的解釋:
- exclusive_terms.term_taxonomy_id是搜索到田間
- 存在的列表獨家價值exclusive_terms。term_taxonomy_id
- 並且也爲exclusive_terms.term_taxonomy_id

如果用戶做出211的搜索,210,圖9中,217,215,218,的exclusive_terms 10個值包括值的列表.term_taxonomy_id,我需要做的第一件事就是將排他性和排他性排除在外。

我得到2所列出:
- 獨家211,210
- inclusives 9,217,215,218,10

後,我可以撰寫此查詢,以2上的同一領域JOINS但調用所產生的場2名不同的別名,然後makeing一個COUNT(DISTINCT只在專屬名詞。

SELECT SQL_CALC_FOUND_ROWS p.id, 
FROM cms_posts p 
    INNER JOIN cms_term_relationships exclusive_terms ON exclusive_terms.object_id = p.id 
    INNER JOIN cms_term_relationships inclusive_terms ON inclusive_terms.object_id = p.id 
WHERE 
    exclusive_terms.term_taxonomy_id IN (211, 210) 
    AND 
    inclusive_terms.term_taxonomy_id IN (9, 217, 215, 218, 10) 
GROUP BY p.id 
HAVING 
    COUNT(DISTINCT exclusive_terms.term_taxonomy_id) = 2 
LIMIT 0, 50 

看來工作!

0

A having子句與count distinct仍然是一種有效的方法。例如,您可以執行的操作是使用案例表達式來處理ID 9和ID 10,因此您可以繼續計算所需的不同ID號。例如:

SELECT SQL_CALC_FOUND_ROWS 
    p.id 
FROM vf_posts p 
    INNER JOIN vf_term_relationships term_rel 
     ON term_rel.object_id = p.id 
WHERE 
    term_rel.term_taxonomy_id IN (211,210,10,9) 
GROUP BY p.id 
HAVING 
    COUNT(DISTINCT CASE term_rel.term_taxonomy_id 
         WHEN 9 THEN 10 
         ELSE term_rel.term_taxonomy_id 
        END) = 4 -- Here! 
LIMIT 0, 50