2011-05-18 71 views
0

目前我正在一个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表。

在此先感谢

回答

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' 
+0

完美的作品,感谢,他们应该给你一枚奖牌为:) – Matthijn 2011-05-18 19:58:07

0

考虑通过重新编写AND S的顺序逻辑(不,括号不作区别)。

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

看到问题了吗?这种情况永远不会是真的,因为US.meta_keyUS.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')) 
+0

我见,有一个AND太多了,但是如果我是正确的,它会搜索具有任何这些条件的用户,并且我想要这两个,谢谢。 – Matthijn 2011-05-18 19:59:33

+0

@Matthijn:不,使用策略性放置的或它会工作得很好。查看我的待处理编辑。 – 2011-05-18 20:24:23

+0

nope,这将无法正常工作......如果有多个Dijkstras或MyFirstNames,您可以将它们全部取出。 – Fosco 2011-05-19 13:26:02

0

你需要加入两次,为每个不同的条件。条件可以在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'