繁体   English   中英

MySQL-如何选择主键多次出现并且至少另一个字段匹配的行?

[英]MySQL - how to select rows where a primary key occurs more than once AND at least one of another field matches?

我有2个表格(注册人和网络广播),其中包含参加我公司网络广播的人员的信息。 “注册人”表显示有关网络广播中注册人的信息,包括他们的电子邮件地址,姓名,网络广播标题,网络广播客户端等。网络广播表显示有关网络广播的详细信息,包括网络广播标题,日期和客户端。

我们的客户希望了解用户何时参加了多个网络广播。 我将这些信息与来自特定网络广播的分析仪表板一起显示。 我需要的是能够在表中找到以下用户:
1.参加了该公司的多个网络广播
2.他们参加的至少一个网络广播必须是所显示的仪表板的网络广播之一

现在,我有了代码来查找参加该公司多个网络广播的用户。 我所缺少的是用于过滤和显示参加该公司一个以上网络广播的用户的代码,而至少有一个网络广播是当前的网络广播。

让我们将此示例与公司名称“ Company”和网络广播标题“ Learning About Company”一起使用

SELECT *
        FROM registrants
        INNER JOIN webcasts ON registrants.WebcastTitle = webcasts.WebcastTitle
        INNER JOIN (
            SELECT Email, Client
        FROM registrants
            GROUP BY Email, Client
            HAVING count(*) > 1
        ) dup ON registrants.Email = dup.Email
        WHERE registrants.Client = 'Company' AND registrants.FirstName != ''
        ORDER BY registrants.Email;

这将返回与该公司进行了多次网络广播的所有用户。 任何人都可以帮我吗?

谢谢!

更新

感谢下面的FuzzyTree的一些帮助,我有了一个有效的查询。 对于有类似问题感兴趣的人,这是我想出的:

SELECT *
FROM registrants
INNER JOIN webcasts ON registrants.WebcastTitle = webcasts.WebcastTitle
INNER JOIN (SELECT registrants.Email
FROM registrants
WHERE registrants.Client = 'Salient' AND registrants.FirstName != '' 
GROUP BY registrants.Email
HAVING COUNT(*) > 1
AND SUM(registrants.Client = 'Salient' AND 
    registrants.WebcastTitle = 'North American Crude Oil Independence: Not Just a Pipe Dream') > 0) t1
    ON t1.Email = registrants.Email
WHERE registrants.Client = 'Salient'
ORDER BY registrants.Email

如果您想选择所有参加过1次以上网络广播的注册者,以及他们参加过的其中1个网络广播的信息(而您不在乎哪一个),则可以使用mysql的扩展按功能分组 ,这使您可以选择列不在group by子句中。

SELECT *
FROM registrants
INNER JOIN webcasts ON registrants.WebcastTitle = webcasts.WebcastTitle
WHERE registrants.Client = 'Company' AND registrants.FirstName != ''
GROUP BY registrants.Email
HAVING COUNT(*) > 1
AND SUM(webcasts.WebcastTitle = 'The Learning Company') > 0
ORDER BY registrants.Email;

如果要所有注册人事件对,其中注册人至少参加了1个名为“公司”的“学习公司”的事件,并且至少参加了2个事件。 由于您要加入registrants.WebcastTitle,因此我假设注册者中的电子邮件不是唯一的。

SELECT *
FROM registrants
INNER JOIN webcasts ON registrants.WebcastTitle = webcasts.WebcastTitle
INNER JOIN (SELECT registrants.Email
FROM registrants
WHERE registrants.FirstName != ''
GROUP BY registrants.Email
HAVING COUNT(*) > 1
AND SUM(registrants.Client = 'Company' AND 
    registrants.WebcastTitle = 'The Learning Company') > 0) t1
    ON t1.Email = registrants.Email

暂无
暂无

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

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