#mysql #wordpress #join
#mysql #wordpress #Присоединиться
Вопрос:
Я пишу плагин, который использует массив данных из базы данных WordPress…
$data = $wpdb->get_results("SELECT * FROM $wpdb->users", ARRAY_A);
Это работает нормально, и я могу отобразить всю информацию из таблицы users, проблема у меня в том, что мне нужно также извлечь имя и фамилию, которые находятся в таблице wp_usermeta.
Есть ли способ изменить инструкцию, чтобы также извлекать эти данные из другой таблицы?
Комментарии:
1. Это может быть возможно, но запрос будет довольно сложным, потому что вы, по сути, пытаетесь извлечь два отдельных мета-ключа для каждого пользователя и сгруппировать их вместе. Кроме того, поля имени и фамилии часто не set…by по умолчанию WordPress использует поле display_name в таблице wp_users (параметр, который необходим для профиля пользователя, в то время как имя и фамилия — нет). Разве это не сработает для целей вашего плагина?
Ответ №1:
Не в одном запросе и не обязательно самом сложном, но следующий приведет к тому, что вы хотите:
$data = $wpdb->get_results("SELECT * FROM $wpdb->users", ARRAY_A);
$i = 0;
foreach($data as $single) {
$meta = $wpdb->get_results(
"SELECT meta_value
FROM $wpdb->usermeta
WHERE user_id = $single[ID]
AND (meta_key = 'first_name' OR meta_key = 'last_name')
ORDER BY meta_key",
ARRAY_A
);
$data[$i]['first_name'] = $meta[0]['meta_value'];
$data[$i]['last_name'] = $meta[1]['meta_value'];
$i ;
}
РЕДАКТИРОВАТЬ: вот это в одном запросе:
$data = $wpdb->get_results(
"SELECT $wpdb->users.*,
GROUP_CONCAT(
$wpdb->usermeta.meta_value
ORDER BY $wpdb->usermeta.meta_key
SEPARATOR ' '
) AS name
FROM $wpdb->users
LEFT JOIN $wpdb->usermeta
ON $wpdb->users.ID = $wpdb->usermeta.user_id
WHERE ($wpdb->usermeta.meta_key = 'first_name'
OR $wpdb->usermeta.meta_key = 'last_name')
GROUP BY $wpdb->users.ID",
ARRAY_A
);
Обратите внимание, что в отличие от первой версии, последняя не выдает $data[x]['first_name']
и $data[x]['last_name']
, а $data[x]['name']
вместо этого. Это связано с тем, что либо хранится в столбце «meta_value». Невозможно выполнить вашу задачу в одном запросе и сохранить имя и фамилию в двух разных ключах массива одновременно.
Следовательно, если вы будете делать это вторым способом, вам позже придется использовать explode()
функцию php для доступа к имени. Или исправьте это в цикле после выполнения запроса:
$i = 0;
foreach($data as $single) {
$name_parts = explode(' ', $single['name']);
$data[$i]['first_name'] = $name_parts[0];
$data[$i]['last_name'] = $name_parts[1];
$i ;
}
Комментарии:
1. Это идеально, именно то, чего я пытался достичь. Функция JOIN действительно сбивала меня с толку, но теперь, когда я увидел ее в моем примере, все имеет смысл! Есть ли способ ограничить возвращаемые результаты только подписчиками или это нужно будет сделать отдельно?
2. @fightstarr20 Это тоже нетривиально, особенно в одном запросе, потому что информация о возможностях снова сохраняется в столбце meta_value таблицы wp_usermeta . Если я найду время сегодня вечером, я соответствующим образом обновлю ответ.
3. Привет, Йоханнес, спасибо, что взглянул на это. Мне удалось включить поле wp_user_level в результаты массива, так что теперь я могу различать уровни пользователей. Я думаю, мне просто нужно знать, как включать в массив только те результаты, которые имеют wp_user_level=> 0
4. Мне все еще не удалось достичь этого, есть ли шанс, что вы могли бы взглянуть на добавление пользовательского уровня в?