繁体   English   中英

加入查询多行进行搜索

[英]Join Query on multiple rows to search in

目前我正在使用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表。

提前致谢

您不能同时将一行连接到另一个表的另一行,因此您需要将另一个表连接两次,一次用于名字,一次用于姓氏。 像这样:

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'

通过重写AND的顺序来考虑逻辑(不,parens没有区别)。

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'))

您需要加入两次,每种情况都有不同的条件。 条件可以在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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM