Изучив запрос, я понял, что проблема не так проста, как я думал, когда комментировал, я не буду удалять ее, но это неправильно.
Я не могу гарантировать, что построенный мной запрос будет лучше, попробуйте его и сравните EXPLAIN
с текущим:
SELECT DISTINCT
u.ID,
u.user_email,
u.display_name,
m.user_id,
SELECT t.meta_value FROM m WHERE m.meta_key = 'first_name' AS first_name,
SELECT t.meta_value FROM m WHERE m.meta_key = 'last_name' AS last_name,
SELECT t.meta_value FROM m WHERE m.meta_key = 'descriptions' AS descriptions,
SELECT t.meta_value FROM m WHERE m.meta_key = 'company_name' AS company_name,
SELECT t.meta_value FROM m WHERE m.meta_key = 'company_website' AS company_website,
SELECT t.meta_value FROM m WHERE m.meta_key = 'phone' AS phone,
SELECT t.meta_value FROM m WHERE m.meta_key = 'company_address' AS company_address,
SELECT t.meta_value FROM m WHERE m.meta_key = 'scategory' AS scategory,
SELECT t.meta_value FROM m WHERE m.meta_key = 'facebook' AS facebook,
SELECT t.meta_value FROM m WHERE m.meta_key = 'twitter' AS twitter,
SELECT t.meta_value FROM m WHERE m.meta_key = 'linkedin' AS linkedin,
SELECT t.meta_value FROM m WHERE m.meta_key = 'youtube' AS youtube,
SELECT t.meta_value FROM m WHERE m.meta_key = 'instagram' AS instagram,
SELECT t.meta_value FROM m WHERE m.meta_key = 'googleplus' AS googleplus,
SELECT t.meta_value FROM m WHERE m.meta_key = 'specialties' AS specialties,
SELECT t.meta_value FROM m WHERE m.meta_key = 'company_logo' AS company_logo
FROM $wpdb->users u
INNER JOIN $wpdb->usermeta m ON (m.user_id = u.ID)
WHERE m.meta_key = 'wp_capabilities'
AND m.meta_value LIKE '%employer%'
ORDER BY u.ID
Это тот же запрос, использующий подзапросы вместо нескольких операторов JOIN
. Я бы порекомендовал вам сделать что-то вроде этого запроса:
WITH cte(u_id, email, display_name, m_user_id)
AS
(
SELECT
u.ID,
u.user_email,
u.display_name,
m.user_id
FROM $wpdb->users u
INNER JOIN $wpdb->usermeta m ON (m.user_id = u.ID)
WHERE m.meta_key = 'wp_capabilities'
AND m.meta_value LIKE '%employer%'
)
SELECT
u.u_id,
u.email,
u.display_name,
u.m_user_id,
m.meta_key,
m.meta_value
FROM cte u
INNER JOIN $wpdb->usermeta m ON (m.user_id = u.u_id)
WHERE m.meta_key IN ('first_name'
'last_name'
'descriptions'
'company_name'
'company_website'
'phone'
'company_address'
'scategory'
'facebook'
'twitter'
'linkedin'
'youtube'
'instagram'
'googleplus'
'specialties'
'company_logo')
ORDER BY u.u_id
Этот второй запрос принесет все необходимые данные, вам просто нужно что-то сделать в своем коде, чтобы взять все поля, относящиеся к идентификатору пользователя, и поместить их в один и тот же объект.