Объединение нескольких запросов к базе данных Wordpress - PullRequest
0 голосов
/ 16 ноября 2010

Простите за переписывание и повторное задание этого вопроса, но ответы, которые я получил пару недель назад, мало чем помогли ...

По сути, я пытаюсь как-то объединить несколько запросов к базе данных в Wordpress для получения идентификаторов пользователей путем поиска термина в таблице 'usermeta', но только для записей, имеющих определенное значение 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}%'");

Я изучил ВНУТРЕННИЕ СОЕДИНЕНИЯ и подзапросы, но, похоже, не могу найти хорошего решения. Я понимаю, что могу справиться с несколькими запросами, но это будет поиск по тысячам записей, поэтому я бы хотел максимально оптимизировать его.

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

Привет @ Джон:

Если я правильно понимаю ваш вопрос (поскольку вы привели технический пример того, что вы пытались, но не описали, какого конечного результата вы пытались достичь, я не уверен) кажется, что вы делать поиск пользователя? Если да, то ниже, я думаю, вам нужно.

<?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

Конечно, это может быть меньше производительности в разы, чем при использовании нескольких запросов, из-за встроенных в WordPress систем кэширования запросов, но это невозможно определить без некоторого тестирования.

Надеюсь, это поможет.

-Mike

P.S. Между прочим, я предполагаю, что вы не знали об этом, но поскольку ваш предыдущий вопрос, очевидно, не получил большой любви к WordPress, и не имел этого, я упомяну веб-сайт WordPress Ответы который является дочерним сайтом StackOverflow. Множество энтузиастов WordPress готовы ответить на вопросы, связанные с WordPress. Мой опыт работы со StackOverflow заключается в том, что у них есть одни из лучших разработчиков в Интернете, но лишь немногие из них имеют конкретный опыт разработки с WordPress, так что вы в конечном итоге найдете здесь людей, которые пытаются ответить на них. Вопросы MySQL, не зная схемы базы данных WordPress и не зная лучших практик WordPress. Спросите на WordPress Ответы, и я думаю, вы улучшите качество ответов на свои вопросы, связанные с WordPress.

0 голосов
/ 16 ноября 2010

Можете ли вы опубликовать некоторые детали сообщений об ошибках, которые вы получаете?Здесь SQL выглядит нормально, но невозможно понять, в чем проблема, не увидев сообщений об ошибках.

Например, вы уверены, что поле $ keyword заполнено?Сколько результатов вернуть?Вы пробовали это без утверждения WHERE или только одного ИЛИ для устранения неполадок?Кроме того, пытались ли вы запустить этот SQL напрямую на вашем сервере с некоторыми тестовыми ключевыми словами?

Дайте нам больше идей о том, что вы пытались решить проблему, и мы сможем помочь вам в дальнейшем.

С уважением, Люк Петерсон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...