2014-01-14 44 views
0

我確定答案已經在這裏某處,但我找不到我特別需要的東西。在mysql中比較兩列相同的連接行

這很簡單。我有一個通過WordPress的一對多表(wp_posts和wp_postmeta)。 postmeta表具有引用帖子表的任意數量的行。

我需要比較不同postmeta行的兩個值。

實施例:

SELECT * 
FROM wp_posts 
JOIN wp_postmeta ON wp_postmeta.post_id = wp_posts.ID 
WHERE 
(
    wp_postmeta.meta_key = 'company' 
    AND 
    wp_postmeta.meta_value LIKE '%Company 01%' 
) AND (
    wp_postmeta.meta_key = 'description' 
    AND 
    wp_postmeta.meta_value LIKE '%Potato%' 
) 

在上面的例子中,我需要檢查的元鍵「公司」和「說明」對同一行內的值。但同時,我需要檢查另一個元鍵/值對。

什麼是比較這些元鍵的正確方法?我需要爲每個項目比較大約10個獨立的元鍵(將來會更多),所以我期望使用太多的子查詢會讓它變慢。

(FYI這是爲WordPress的境外使用,無需通知我關於get_post_meta()函數)

+0

相關:[爲多個元值定製WordPress SQL查詢]( http://kuttler.eu/code/custom-wordpress-sql-query-for-multiple-meta-values/) - 爲每個元鍵使用單獨的連接。如果我打算使用10個以上的密鑰,似乎效率極低。我需要在這裏最大化性能,因爲這是一個ajax腳本。 –

+0

它可能看起來效率低下,但它表現相當好 – Strawberry

+0

哦,是嗎?我不這麼認爲,也許如果我比較主鍵,但這都是字符串。我想我會用這個解決方案滾動,直到找到更好的解決方案(如果有更好的解決方案)。當我獲得更多的數據時,我肯定會做一些速度測試。 –

回答

0

雖然我不服氣的表現,直到我做了一些進一步的調查,路段I放在原來的問題(here)的意見似乎工作。 Strawberry已經解釋說這種方法「表現相當好」,所以我會繼續這樣做。

我想我會發布這個問題的答案,因爲我現在正在工作。如果有人對這個答案有了改進(如果有的話)可以隨意分開發布,我一定會接受最好/最有效的查詢。

最後,這裏是我正在使用的查詢的簡化版本,其中大多數不必要的垃圾被取消了。這裏的主要目標是對每個元字段進行連接併爲其分配一個名稱,以便該字段包含WHERE語句的唯一行:

set @search_term_1 = '%This string is only found in post meta skills%'; 

select * 

from wp_posts post 

join wp_postmeta meta_comp ON (meta_comp.post_id = post.ID AND meta_comp.meta_key = 'post_company') 
join wp_postmeta meta_reas ON (meta_reas.post_id = post.ID AND meta_reas.meta_key = 'post_reason') 
join wp_postmeta meta_skill ON (meta_skill.post_id = post.ID AND meta_skill.meta_key = 'post_skills') 
join wp_postmeta meta_method ON (meta_method.post_id = post.ID AND meta_method.meta_key = 'post_method') 

where 

    -- Check post title and description 
    post.post_title LIKE @search_term_1 
    or 
    post.post_content LIKE @search_term_1 
    or 
    meta_comp.meta_value LIKE @search_term_1 
    or 
    meta_reas.meta_value like @search_term_1 
    or 
    meta_skill.meta_value like @search_term_1 
    or 
    meta_method.meta_value like @search_term_1 


group by post.ID 

limit 10