2010-11-16 87 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特定问题的答案质量。