2010-11-16 85 views
0

原諒我重新措辭並重新問這個問題,但我收到的答案几個星期前並沒有太大的幫助......結合複式WordPress數據庫查詢

基本上,我期待以某種方式在WordPress的合併多個數據庫查詢由「usermeta」表搜索詞來檢索用戶ID,但只有具有一定的「meta_value」

項我想結合:

$users = $wpdb->get_results("SELECT user_id, meta_value as 'business_name' 
FROM $wpdb->usermeta 
WHERE meta_key = 'business_name'"); 

AND:

$users = $wpdb->get_results("SELECT user_id, meta_value as 'business_description' 
FROM $wpdb->usermeta 
WHERE meta_key = 'business_description'"); 

基本上有這樣:

$users = $wpdb->get_results("SELECT user_id, business_name, business_description 
FROM 
WHERE 
    business_name LIKE '%{$keyword}%' OR 
    business_description LIKE '%{$keyword}%'"); 

我已經研究過內部連接和子查詢,但似乎無法找到一個很好的解決方案。我意識到我可以避開多個查詢,但是這可能會搜索數以千計的條目,所以我想盡可能優化它。

+0

看起來很好(除了FROM表達式中缺少的表名)。問題是什麼? – Hamish 2010-11-16 00:33:02

回答

0

你可以發佈你收到的錯誤消息的一些細節嗎?這裏的SQL看起來不錯,但是如果沒有看到錯誤信息就不可能知道問題是什麼。

例如,您確定$關鍵字字段正在填充?要返回多少結果?您是否嘗試過沒有WHERE語句或者只是單個OR來排除故障?另外,您是否嘗試過使用一些測試關鍵字直接在您的服務器上運行此SQL?

給我們更多關於您嘗試解決問題的想法,我們將能夠進一步提供幫助。

親切的問候 盧克·彼得森

1

@約翰:

如果我明白你的問題正確(因爲你給的你試圖什麼技術的例子,但不是最終結果的說明你試圖完成我不知道)它似乎你正在做一個用戶搜索?如果是的話,下面是我認爲你需要的。

<?php 

    // Load WordPress, but only for standalone example use 
    include '../wp-load.php'; 

    // Make sure the database object is available 
    global $wpdb; 

    // Get value entered by the user 
    $keyword = $_GET['keyword']; 

    // This would be used in your code; the percent would confuse prepare() below 
    $keyword = "%{$keyword}%"; 

    // Join each meta field as a separate join and reference the meta_key in the join 
    // prepare() below replaces "%s" with a quoted string value 
    $sql =<<<SQL 
SELECT 
    users.user_nicename AS user_name, 
    bizname.meta_value AS business_name, 
    bizdesc.meta_value AS business_description 
FROM 
    {$wpdb->users} AS users 
    INNER JOIN {$wpdb->usermeta} AS bizname 
    ON bizname.user_id=users.ID 
    AND bizname.meta_key='business_name' 
    INNER JOIN {$wpdb->usermeta} AS bizdesc 
    ON bizdesc.user_id=users.ID 
    AND bizdesc.meta_key='business_description' 
WHERE 1=0 
    OR bizname.meta_value LIKE %s 
    OR bizdesc.meta_value LIKE %s 
SQL; 

    // User prepare() to avoid SQL injection hacks 
    $sql = $wpdb->prepare($sql,$keyword,$keyword); 

    // Finally, get yer results! 
    $users = $wpdb->get_results($sql); 
    echo "<ul>"; 
    foreach($users as $user) { 
    echo "<li>User= {$user->user_name}, Business= {$user->business_name}:{$user->business_description}</li>"; 
    } 
    echo "<ul>"; 

上面是一個完整的工作示例,你可以複製到文件在您的網站的根目錄,並調用它像/test.php讓你看到它通過URL像這樣的工作:

http://example.com/test.php?keyword=Accounting

當然,這有時可能高性能比使用,因爲內置於WordPres查詢緩存系統的多個查詢但如果沒有一些基準測試是不可能的。

希望這會有所幫助。

-Mike

P.S.順便說一句,我假設你沒有意識到這一點,但因爲你之前的問題顯然沒有得到太多的WordPress愛,也沒有這個我會提到WordPress Answers website這是一個姊妹站點StackOverflow。很多WordPress愛好者都在那裏爲您解答WordPress的具體問題。我對StackOverflow的經驗是他們擁有一些網絡上最好的開發人員,但很少有人在使用WordPress進行開發的具體經驗,所以最終人們在這裏試圖回答不知道WordPress數據庫模式而不知道WordPress特定最佳實踐的MySQL問題。在WordPress的答案中問一下,我想你會提高你的WordPress特定問題的答案質量。