【问题标题】:Join multiple tables with Having expression使用 Having 表达式连接多个表
【发布时间】:2022-12-17 18:28:36
【问题描述】:

有 2 个表 Contacts 和 BlockedEntries

表:联系人

身份证 名字 姓氏 电子邮件 职务

表:BlockedEntries

身份证电邮

尝试从联系人表中查找具有不止一次被阻止条目的条目

SELECT email, COUNT(*)  as cc, GROUP_CONCAT( id  SEPARATOR '#') AS ContactIds 
FROM contacts 
where email IN (SELECT email FROM BlockedEntries)
GROUP BY email   
HAVING COUNT(*) > 1 

对于计数超过 1 的条目,有什么方法可以获取更多其他详细信息,例如名字、姓氏、电子邮件、职位等

不幸的是,这两个表之间没有关系,电子邮件是唯一可能的映射。 CONtact 表中可以存在 1 个或多个具有相同电子邮件地址的条目

样本数据

Id  FirstName LastName Email JobTitle

12  sam   j  samj@gmail.com  engineer
23  bos   j  bosj@gmail.com  accountnt
34  cas   j  samj@gmail.com  engineer
33  xxx   j  bosj@gmail.com  fied
55  dfe   c  dfe@gmail.com   student


Table: BlockedEntries

Id  Email              CreateDate
1    samj@gmail.com     09/12/2020 19:30:20
2    bosj@gmail.com     09/12/2020 19:30:20
3    dfe@gmail.com       09/12/2020 19:30:20


Result expecting 

email              id  firstname lastName jobtitle 

samj@gmail.com    12  sam   j     engineer
samj@gmail.com    34  bos   j     accountnt
bosj@gmail.com    23  cas   j      engineer
bosj@gmail.com    33  xxx   j      fied


dfe@gmail.com only 1 instance and no need to add this to result set

【问题讨论】:

  • 请添加示例数据。
  • 请添加表描述、一些数据示例、预期结果以及您使用的 MySQL 版本?
  • 不幸的是,这两个表和电子邮件之间没有关系??是的,在电子邮件中没有 fk 的事实不是问题,但它没有被索引的事实可能会影响性能
  • 这只是跨不同数据库的 2 个表的一次性报告所以性能并不是真正的问题我设法获得了重复电子邮件的 ID 但很高兴获得更多信息。我可以对其他列使用相同的 GROUP_CONCAT,但想将其放在不同的行中

标签: mysql sql


【解决方案1】:

在 MySQL 8+ 上,我会在这里使用 COUNT() 作为分析函数:

WITH cte AS (
    SELECT *, COUNT(*) OVER (PARTITION BY email) email_cnt
    FROM contacts
)

SELECT c.Id, c.FirstName, c.LastName, c.Email, c.JobTitle
FROM cte c
WHERE email_cnt > 1 AND
      EXISTS (
          SELECT 1
          FROM BlockedEntries be
          WHERE be.email = c.email
      );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    相关资源
    最近更新 更多