目前我正在使用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)是users表,这里(http://cl.ly/6rts)是users_meta表。
提前致谢
答案 0 :(得分:2)
您不能同时将一行连接到另一个表的另外两行,因此您需要将另一个表连接两次,一次用于名字,一次用于姓氏。像这样:
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'
答案 1 :(得分:0)
通过重写AND
s的顺序来考虑逻辑(不,parens没有区别)。
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
。
修改强>
这样的查询会为您提供所需的结果:
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'))
答案 2 :(得分:0)
您需要加入两次,每次都有不同的条件。条件可以在RedFilter建议的WHERE子句中,但为了便于阅读,我更喜欢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'