【问题标题】:Query for duplicate meta_value under different meta_key for the same user_id查询相同user_id的不同meta_key下的重复meta_value
【发布时间】:2021-09-15 22:58:26
【问题描述】:

我已经尝试了几个小时来获取 2 个不同 meta_key 的 meta_value 相同的所有 ID。

例如我希望下面的示例返回 user_id 1 和 2,因为它们的 first_name 和 last_name 的 meta_value 在相同的 user_id 下完全相同。

user_id meta_key meta_value
0 first_name Joe
0 last_name Doe
1 first_name Peter
1 last_name Peter
2 first_name Simon
2 last_name Simon

提前致谢!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    在 MySQL 中,您可以只使用聚合:

    select vals, group_concat(user_id) as user_ids
    from (select user_id,
                 group_concat(meta_value order by meta_key) as vals
          from t
          where meta_key in ('first_name', 'last_name')
          group by user_id
          having count(*) = 2  -- both keys present
         )
    group by vals
    having count(*) >= 2;
    

    这将返回具有这些值的用户 ID 列表的串联键。

    注意:此特定公式假定名称中没有逗号(group_concat() 的默认分隔符)。如果有问题,您可以将分隔符调整为不太常用的字符,例如 |

    【讨论】:

      【解决方案2】:

      您可以自行加入表格

      CREATE TABLE tab1
          (`user_id` int, `meta_key` varchar(10), `meta_value` varchar(5))
      ;
          
      INSERT INTO tab1
          (`user_id`, `meta_key`, `meta_value`)
      VALUES
          (0, 'first_name', 'Joe'),
          (0, 'last_name', 'Doe'),
          (1, 'first_name', 'Peter'),
          (1, 'last_name', 'Peter'),
          (2, 'first_name', 'Simon'),
          (2, 'last_name', 'Simon')
      ;
      
      SELECT DISTINCT a.user_id FROM tab1 a INNER JOIN tab1 b 
      ON a.`meta_value` = b.`meta_value` AND a.`meta_key` <> b.`meta_key` 
      AND a.`meta_key` = 'first_name' AND b.`meta_key` = 'last_name'
      
      |用户 ID | | ------: | | 1 | | 2 |

      db小提琴here

      【讨论】:

        猜你喜欢
        • 2017-06-21
        • 1970-01-01
        • 2015-03-03
        • 2019-11-06
        • 2021-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-24
        相关资源
        最近更新 更多