Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何显示表_1中正好有n个条目的表_2中的条目?_Mysql_Sql - Fatal编程技术网

Mysql 如何显示表_1中正好有n个条目的表_2中的条目?

Mysql 如何显示表_1中正好有n个条目的表_2中的条目?,mysql,sql,Mysql,Sql,所以我不完全确定如何以一种普遍的方式问这个问题,所以我只想问一下它是如何呈现给我的。两个相关表格为: Manager ( ID: integer, LoginID: varchar(16), Name: varchar(64), Password: varchar(8), Birthday: date, Address: varchar(128), Email: varchar(32), PhoneNumber: ch

所以我不完全确定如何以一种普遍的方式问这个问题,所以我只想问一下它是如何呈现给我的。两个相关表格为:

Manager (
    ID: integer, 
    LoginID: varchar(16), 
    Name: varchar(64), 
    Password: varchar(8), 
    Birthday: date, 
    Address: varchar(128), 
    Email: varchar(32), 
    PhoneNumber: char(10)
)  

ManagerCertificate (
    ManagerID: integer, -- Foreign key: ManagerID references Manager(ID) 
    CertificateId: integer, 
    Certificate: blob
)
显示每个拥有3个不同证书的经理的姓名和电子邮件

我试过几件事,但总是失败。 我是否使用嵌套子查询,计数运算符可能

select M.Name, M.Email
from Manager M, ManagerCertificate MC
??? where MC.ManagerID = M.ID    ???
我期待着被指向正确的方向。我可能把事情复杂化了


谢谢

我可以用Oracle SQL给你一个答案,你可以翻译一下

Select m.manager_id, m.manager_name  
from managers m, 
(select manager_id, count(*)
from certificates
group by manager_id
having count = 3) c
where m.manager_id = c.manager_id

我可以用Oracle SQL给你一个答案,你可以翻译一下

Select m.manager_id, m.manager_name  
from managers m, 
(select manager_id, count(*)
from certificates
group by manager_id
having count = 3) c
where m.manager_id = c.manager_id
使用COUNT进行连接是实现此目的的一种方法,它根据管理器名称和电子邮件进行分组,并使用“确保管理器正好有3个不同的证书”进行检查。请注意,MySQL<5.7将允许您在M.ID上分组,但最好编写仍适用于更高版本的查询。还请注意,带有ON子句的显式连接语法优于老式的逗号连接

SELECT M.Name, M.Email
FROM Manager M
JOIN ManagerCertificate MC ON MC.ManagerID = M.ID
GROUP BY M.Name, M.Email
HAVING COUNT(DISTINCT MC.CertificateId) = 3
使用COUNT进行连接是实现此目的的一种方法,它根据管理器名称和电子邮件进行分组,并使用“确保管理器正好有3个不同的证书”进行检查。请注意,MySQL<5.7将允许您在M.ID上分组,但最好编写仍适用于更高版本的查询。还请注意,带有ON子句的显式连接语法优于老式的逗号连接

SELECT M.Name, M.Email
FROM Manager M
JOIN ManagerCertificate MC ON MC.ManagerID = M.ID
GROUP BY M.Name, M.Email
HAVING COUNT(DISTINCT MC.CertificateId) = 3

我喜欢在这里使用子查询和COUNTDISTINCT


我喜欢在这里使用子查询和COUNTDISTINCT


您将需要分组,具有和计数不同。并且,请使用显式连接语法。您需要分组方式、具有和计数不同。请使用显式连接语法。您可能需要COUNTDISTINCT。。。以防经理多次收到相同的证书。OP没有具体说明,所以假设CertificateID是唯一的是不安全的。想法不错-我想象这些是某种管理认证,所以不会出现重复。不过,我很感谢你的贡献。使用古老连接语法的答案是如何获得投票的?你可能想要一个不同的答案。。。以防经理多次收到相同的证书。OP没有具体说明,所以假设CertificateID是唯一的是不安全的。想法不错-我想象这些是某种管理认证,所以不会出现重复。不过,我很感谢你的贡献。使用古老连接语法的答案是如何获得投票的?