Присоединиться к Query на нескольких строках для поиска в - PullRequest
0 голосов
/ 18 мая 2011

В настоящее время я работаю над сайтом Wordpress, и я хотел бы, чтобы можно было искать пользователей по их имени и фамилии на части моего сайта.

Wordpress использует мета-таблицу для хранения любых «дополнительных» данных для пользователя. И имя и фамилия являются одними из тех мета полей.

Теперь я пытаюсь создать запрос, который дает мне результат, который возвращает мне пользователя, соответствующего имени и фамилии, единственная проблема в том, что есть мета-строка для фамилии и еще одна для имени, они оба имеют ссылку на один и тот же user_id. Только я не знаю, как правильно создать запрос.

Когда у меня есть этот запрос

SELECT U.id FROM wp_users AS U, wp_usermeta as US
WHERE U.id=US.user_id
AND (US.meta_key='first_name' AND US.meta_value='MyFirstName')

Возвращает пользователя, которого я ищу, однако, когда я пытаюсь это сделать

SELECT U.id FROM wp_users AS U, wp_usermeta as US
WHERE U.id=US.user_id
AND (US.meta_key='first_name' AND US.meta_value='MyFirstName')
AND (US.meta_key='last_name' AND US.meta_value='Dijkstra')

Я не получаю никаких результатов, кто-нибудь может мне помочь?

В случае, если кого-то интересует структура базы данных, здесь (http://cl.ly/6rGx) - таблица пользователей, а здесь (http://cl.ly/6rts) - таблица users_meta.

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

Вы не можете объединить одну строку с двумя другими строками другой таблицы одновременно, поэтому вам нужно присоединиться к другой таблице дважды, один раз для имени и один раз для фамилии.Как это:

SELECT U.id 
FROM wp_users AS U
inner join wp_usermeta as UMF on U.id = UMF.user_id 
inner join wp_usermeta as UML on U.id = UML.user_id 
WHERE UMF.meta_key = 'first_name' 
    AND UMF.meta_value = 'MyFirstName'
    AND UML.meta_key = 'last_name' 
    AND UML.meta_value = 'Dijkstra'
0 голосов
/ 18 мая 2011

Вам нужно присоединиться дважды, с разными условиями для каждого. Условия могут быть в предложении WHERE, как предложил RedFilter, но я предпочитаю составные условия в предложении JOIN для удобства чтения.

SELECT U.id 
FROM wp_users U
join wp_usermeta f on U.id = f.id 
                   and f.meta_key='first_name' 
                   and f.meta_value='MyFirstName'
join wp_usermeta l on U.id = l.id 
                   and l.meta_key='last_name' 
                   and l.meta_value='Dijkstra'

Немного другая версия с ключами в соединении и запрошенными значениями в предложении where:

SELECT U.id 
FROM wp_users U
join wp_usermeta f on U.id = f.id and f.meta_key='first_name' 
join wp_usermeta l on U.id = l.id and l.meta_key='last_name' 
where f.meta_value='MyFirstName' and l.meta_value='Dijkstra'
0 голосов
/ 18 мая 2011

Рассмотрите логику, переписав порядок AND с (нет, парены не имеют значения).

US.meta_key='first_name' AND US.meta_key='last_name' AND
US.meta_value='MyFirstName' AND US.meta_value='Dijkstra'

Видишь проблему? Это условие никогда не будет истинным, потому что ни US.meta_key, ни US.meta_value никогда не будут двумя значениями. Вам нужно использовать OR, а не AND.

EDIT

Такой запрос даст желаемые результаты:

SELECT U.id FROM wp_users AS U, wp_usermeta as US
WHERE U.id=US.user_id AND (
    (US.meta_key='first_name' AND US.meta_value='MyFirstName')
    OR (US.meta_key='last_name' AND US.meta_value='Dijkstra'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...