结合多个Wordpress数据库查询

时间:2010-11-16 00:26:28

标签: mysql wordpress join subquery

请原谅我重新措辞并重新提出这个问题,但我几周前收到的答案并没有多大帮助......

基本上,我希望以某种方式将Wordpress中的多个数据库查询组合起来,通过在'usermeta'表中搜索term来检索用户ID,但只有具有某个'meta_value'的条目

我正在尝试合并:

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

$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}%'");

我查看过INNER JOIN和子查询,但似乎无法找到一个好的解决方案。我意识到我可以逃脱多个查询,但这可能会搜索数千个条目,所以我想尽可能地优化它。

2 个答案:

答案 0 :(得分:1)

您好 @John:

如果我理解你的问题是正确的(因为你提供了一个关于你正在尝试的技术示例,但没有描述你想要完成的最终结果,我不确定)它似乎你正在进行用户搜索?如果是,下面是我认为你需要的。

<?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,以便您通过使用以下网址查看其工作:

  

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

当然,由于WordPress内置的查询缓存系统,有时候这可能比使用多个查询更少 ,但如果没有一些基准测试就无法判断。

希望这有帮助。

-Mike

P.S。顺便说一句,我假设你没有意识到这一点,但由于你之前的问题显然没有得到太多的WordPress爱,也没有这个,我会提到WordPress Answers website这是StackOverflow的姊妹网站。很多WordPress爱好者都在那里回答特定于WordPress的问题。我对StackOverflow的经验是,他们有一些网络上最优秀的开发人员,但很少有人有使用WordPress进行开发的特定经验,所以你最终会找到这里的人试图回答MySQL在不知道WordPress数据库架构的情况下提出问题,并且不知道特定于WordPress的最佳实践。在WordPress Answers上询问,我认为你的WordPress特定问题的答案质量会有所提高。

答案 1 :(得分:0)

您可以发布有关您收到的错误消息的一些详细信息吗?这里的SQL看起来没问题,但是如果没有看到错误消息就无法确定问题是什么。

例如,您确定正在填充$ keyword字段吗?要返回多少结果?您是否在没有WHERE语句的情况下尝试过它,或者仅使用一个OR进行故障排除?另外,您是否尝试使用某些测试关键字直接在服务器上运行此SQL?

让我们更多地了解您尝试解决问题的方法,我们将能够进一步提供帮助。

亲切的问候 卢克彼得森