【问题标题】:Join Query on multiple rows to search in在多行上加入查询以进行搜索
【发布时间】:2011-08-28 08:35:50
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: php mysql wordpress join


    【解决方案1】:

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

    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'
    

    【讨论】:

    • 完美运行,谢谢,他们应该为此给你一枚奖章:)
    【解决方案2】:

    您需要参加两次,每次参加的条件不同。条件可以按照 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'
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我明白了,AND 太多了,但是如果我是正确的,它会搜索具有任何这些条件的用户,我想要两个,无论如何,谢谢。
      • @Matthijn:不,使用战略性放置的 OR 就可以了。查看我的待编辑。
      • 不,这行不通...如果有多个 Dijkstras 或 MyFirstNames,您将得到它们。
      猜你喜欢
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 2021-04-23
      • 2013-02-06
      • 2015-11-24
      相关资源
      最近更新 更多