【问题标题】:Need Search two values in one field Mysql需要在一个字段中搜索两个值Mysql
【发布时间】:2013-12-14 04:16:55
【问题描述】:

我需要在同一个字段中搜索两个值。

╔════╦════════════╦══════════════╗
║ ID ║ Meta_key   ║ Meta_value   ║
╠════╬════════════╬══════════════╣
║  1 ║ first_name ║    pritesh   ║
║  2 ║ last_name  ║    mahajan   ║
║  3 ║ first_name ║    ritesh    ║
║  4 ║ last_name  ║    jain      ║
║  5 ║ first_name ║    john      ║
║  6 ║ last_name  ║    a         ║
║  7 ║ first_name ║    Mambo     ║
║  8 ║ last_name  ║    Nombo     ║
╚════╩════════════╩══════════════╝  

这是我的表,我想搜索所有的名字和姓氏。下面是我的查询,但这并没有返回我想要的。

SELECT * 
FROM `wp_usermeta` 
WHERE `meta_key` = 'last_name' 
  AND `meta_value` LIKE  '%mahajan%' 
  AND `meta_key` = 'first_name' 
  AND `meta_value` LIKE  '%a%'; 

【问题讨论】:

  • 您有多个名字和姓氏,但一个人的名字和姓氏如何联系起来?
  • 查询无法工作,因为您正在搜索列Meta_Key 的值first_name last_name 同时存在的行.它看起来像一个格式不正确的表结构,因为名字和姓氏没有相互关联。
  • 是的,如果可能的话,请检查 Wordpress 用户元表。
  • 我认为这张表设计错误。
  • 在不知道 WP 的表结构如何的情况下,我认为必须有一个表从您的问题中引用元表。你应该用它来连接名字和姓氏。

标签: php mysql sql wordpress


【解决方案1】:

架构

CREATE TABLE wp_usermeta 
    (
     id int auto_increment primary key, 
     meta_name varchar(20), 
     meta_value varchar(30)
    );

INSERT INTO wp_usermeta
(meta_name, meta_value)
VALUES
('first_name', 'pritesh'),
('last_name', 'mahajan'),
('first_name', 'ritesh'),
('last_name', 'jain'),
('first_name', 'john'),
('last_name', 'a'),
('first_name', 'Mambo'),
('last_name', 'Nombo'); 

查询应该是这样的......

SELECT meta_name, meta_value
FROM wp_usermeta
WHERE 
(meta_name = 'last_name' AND meta_value LIKE  '%mahajan%' )
  OR
(meta_name = 'first_name' AND meta_value LIKE  '%a%'); 

【讨论】:

    【解决方案2】:

    给你

    SQL Fiddle

    查询

    SELECT first_name, last_name
    FROM 
      (
        (
          SELECT meta_value AS first_name, id AS a_id 
          FROM wp_usermeta 
          WHERE meta_name = 'first_name'
        ) as a
      )
    JOIN
      (
        (
          SELECT meta_value AS last_name, id AS b_id 
          FROM wp_usermeta 
          WHERE meta_name = 'last_name'
        ) as b
      )
    WHERE a_id = b_id-1
    

    Results

    | FIRST_NAME | LAST_NAME |
    |------------|-----------|
    |    pritesh |   mahajan |
    |     ritesh |      jain |
    |       john |         a |
    |      Mambo |     Nombo |
    

    这样,您可以轻松地使用两个虚拟列first_namelast_name 进行搜索。您只需要在WHERE 子句中添加额外的条件。像这样:

      WHERE a_id = b_id-1
      AND first_name LIKE "%tesh%"
      AND last_name LIKE "%jai%"
    

    会产生

    | FIRST_NAME | LAST_NAME |
    |------------|-----------|
    |     ritesh |      jain |
    

    注意

    我在这里(基于您的示例数据)所做的主要假设是 相关 first_namelast_name 总是会有连续的 id。 (表中有两个连续的记录)。

    【讨论】:

    • 您能否再告诉我一个如何添加新加入的信息,因为我想为电子邮件 ID 添加新加入。电子邮件 ID 来自其他表,我们将使用现有表的 ID 来获取电子邮件 ID。
    【解决方案3】:

    我认为两行必须共享相同的键。也许是IDuser_id(您的问题中没有显示?)。如果是这种情况,您可以使用此查询返回您要查找的 ID:

    SELECT ID
    FROM `wp_usermeta`
    WHERE
      (`meta_key` = 'last_name' AND `meta_value` LIKE  '%mahajan%')
      OR (`meta_key` = 'first_name' AND `meta_value` LIKE  '%a%)
    GROUP BY ID
    HAVING COUNT(*)=2
    

    请将 ID 替换为实际 ID。

    【讨论】:

    • 对于同一行,meta_key 究竟如何同时成为 first_namelast_name?您可能打算将OR 放在括号之间。不是AND
    • 那么 id 不是主键。 WP真的是这样吗?他们的数据库架构非常草率。
    • @PhpMyCoder 必须有一个主键,我认为它是 ID ...但如果不是,则无法获得 OP 想要的东西,我将删除我的答案: )
    • @fthiella 我假设 OP 遗漏了一个外键。另外要明确一点,我并没有挑战您的答案。事实上,除了GROUP BY ID HAVING COUNT(*)=2 之外,您的 SQL 似乎与您所要求的一样。但话又说回来,我不是 OP。 :)
    【解决方案4】:

    你可以试试这个,

     SELECT * FROM `wp_usermeta` WHERE (`meta_key` = 'last_name' OR `meta_key` = 'first_name' ) and (`meta_value` LIKE  '%mahajan%' OR `meta_value` LIKE  '%a%')
    

    【讨论】:

    • 在上述查询中,您的条件是“first_name = %mahajan% or first_name = %a% or last_name = %mahajan% or last_name = %a%”。我不认为这是行动想要的。
    • 此查询正在运行,但是当获取姓氏时,它不会按名字搜索,因为我们使用的是 OR 条件..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    相关资源
    最近更新 更多