Mysql SQL查询以返回子查询的精确列表
所以我被问到这个问题: 考虑以下表中的黑体键:教授(profid,profname,department)学生(studid,studname,major)和建议(profid,studid) 返回与id为“123456789”的学生的顾问完全相同的学生的姓名Mysql SQL查询以返回子查询的精确列表,mysql,sql,Mysql,Sql,所以我被问到这个问题: 考虑以下表中的黑体键:教授(profid,profname,department)学生(studid,studname,major)和建议(profid,studid) 返回与id为“123456789”的学生的顾问完全相同的学生的姓名 我提出的查询并没有返回完全相同的顾问,而是返回学生123456789和其他学生之间常见的顾问。例如,如果学生123456789有顾问1和2,而学生5只有顾问1,我当前的查询将返回学生5,这是不正确的。该查询只应返回同时具有顾问1和顾问2的
我提出的查询并没有返回完全相同的顾问,而是返回学生123456789和其他学生之间常见的顾问。例如,如果学生123456789有顾问1和2,而学生5只有顾问1,我当前的查询将返回学生5,这是不正确的。该查询只应返回同时具有顾问1和顾问2的学生。以下是我目前的疑问:
SELECT studname
FROM Student
WHERE studid IN
(
SELECT DISTINCT studid
FROM Advise
WHERE profid IN
(
SELECT profid
FROM Advise
WHERE studid = '123456789'
)
);
我怎样才能让这个查询返回建议学生123456789的学生的确切列表?我的解决方案是找到不同的学生顾问,然后取否定值 请尝试使用脚本:
SELECT studid,studname
FROM Student
WHERE studid not in
(
select studid
from
(
SELECT a.studid, b.profid
FROM Advise a
left join
(
SELECT profid
FROM Advise
WHERE studid = '123456789'
) b on b.profid = a.profid
where a.studid not like '123456789'
) x
where x.profid is null
)
group by studid,studname
having count(*) = (SELECT count(profid) FROM Advise WHERE studid = '123456789')
你在找什么东西吗
select studname from Student where studid in
(
select studid from (
select studid, GROUP_CONCAT(profid) profs from advice
group by studid having profs in (
select studid, GROUP_CONCAT(profid) profs from advice group by
studid having studid = '123456789'
)
)
)
我测试它运行正常。您可以尝试:
SELECT a.studid, b.studname
FROM (
SELECT studid, COUNT(studid) AS numstud
FROM Advise
WHERE
profid IN (
SELECT profid FROM Advise WHERE studid = 123456789
) AND
studid NOT IN (
SELECT studid FROM Advise WHERE profid NOT IN (
SELECT profid FROM Advise WHERE studid = 123456789
)
)
GROUP BY studid
HAVING numstud = (SELECT COUNT(*) FROM Advise WHERE studid = 123456789)
) AS a LEFT JOIN Student AS b ON (a.studid = b.studid)
学生123456789有顾问1和2。学生1有顾问1、2和3。返回学生1。这是对的吗?不,在这种情况下,学生1只有在只有advisor 1和2的情况下才会返回。我认为您需要创建
视图表
@MrKen我想您可能是对的。在Sql Server、Oracle或Postgresql等具有窗口功能的现代数据库中,这将容易得多。MySql已经落后了,十多年来,它一直缺少窗口功能、CTE、横向连接等等,以至于不能真正成为一个现代数据库。这不起作用,查询返回了表中的所有学生姓名。此查询没有返回任何结果我在“in”和“not in”处出错。您能再试一次吗?请输入别名table@j10i2此查询缺少派生表别名“请说明是哪个字段/表别名。”。如果需要任何更改,请告诉我