Compex MySQL Left Join, используя несколько записей из мета-таблиц - PullRequest
2 голосов
/ 17 сентября 2010

Я пытаюсь создать один запрос для получения информации из основной таблицы (пользовательской таблицы WordPress) и пользовательской мета-таблицы.

Если вы не знакомы с архитектурой WP DB: wp_users содержит базовую информацию о пользователях и их идентификаторах, wp_usermeta содержит идентификатор, meta_key и meta_value.

Допустим, я хочу получить всех пользователей, которые имеют определенные meta_keys и meta_values. Это мой запрос (сгенерированный через PHP на основе доступных meta_keys):

SELECT ID, 
user_email, 
user_login, 
first_name.meta_value as first_name,
last_name.meta_value as last_name,
phone_number.meta_value as phone_number,
wp_capabilities.meta_value as wp_capabilities 
FROM wp_users, 
(select * from wp_usermeta where meta_key = 'first_name') as first_name,
(select * from wp_usermeta where meta_key = 'last_name') as last_name,
(select * from wp_usermeta where meta_key = 'phone_number') as phone_number,
(select * from wp_usermeta where meta_key = 'wp_capabilities') as wp_capabilities 
WHERE  
ID = first_name.user_id AND 
ID = last_name.user_id AND 
ID = phone_number.user_id AND 
ID = wp_capabilities.user_id  AND 
wp_wpi_capabilities.meta_value LIKE '%administrator%'   
ORDER BY first_name

Это хорошо работает, однако, если у определенного пользователя отсутствует мета-ключ, например, 'last_name', эта строка пользователя вообще не возвращается. Так что на самом деле все, что мне нужно, это способ вернуть значение Null для отсутствующих мета-ключей.

Прямо сейчас у меня есть очень хакерская функция, которая проходит и создает пустые meta_keys и meta_values ​​для всех пользователей, у которых нет заданного meta_key, таким образом они возвращаются. Это ужасный способ сделать это, когда у вас более тысячи пользователей, и вам нужно добавить новый тип meta_key.

Дайте мне знать, если кто-то сделал это, или мне нужно объяснить лучше.

Спасибо.

1 Ответ

14 голосов
/ 17 сентября 2010

Поместите критерии объединения usermeta в объединение, а не борясь с подзапросами:

SELECT
    ID, user_email, user_login, 
    first_name.meta_value as first_name,
    last_name.meta_value as last_name,
    phone_number.meta_value as phone_number,
    wp_capabilities.meta_value as wp_capabilities 
FROM wp_users
    JOIN wp_usermeta AS wp_capabilities ON wp_capabilities.user_id=ID
        AND wp_capabilities.meta_key='wp_capabilities'
    LEFT JOIN wp_usermeta AS first_name ON first_name.user_id=ID
        AND first_name.meta_key='first_name'
    LEFT JOIN wp_usermeta AS last_name ON last_name.user_id=ID
        AND last_name.meta_key='last_name'
    LEFT JOIN wp_usermeta AS phone_number ON phone_number.user_id=ID
        AND phone_number.meta_key='phone_number'
WHERE
    wp_capabilities.meta_value LIKE '%administrator%'
ORDER BY
    first_name
...