Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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 SQL查询以返回子查询的精确列表_Mysql_Sql - Fatal编程技术网

Mysql SQL查询以返回子查询的精确列表

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的

所以我被问到这个问题:

考虑以下表中的黑体键:教授(profid,profname,department)学生(studid,studname,major)和建议(profidstudid

返回与id为“123456789”的学生的顾问完全相同的学生的姓名


我提出的查询并没有返回完全相同的顾问,而是返回学生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此查询缺少派生表别名“请说明是哪个字段/表别名。”。如果需要任何更改,请告诉我