Mysql 具有多个条件的SQL查询不起作用

Mysql 具有多个条件的SQL查询不起作用,mysql,sql,join,group-by,having-clause,Mysql,Sql,Join,Group By,Having Clause,好的,这是我提出问题的最好尝试。它当前执行,但不返回任何其他尝试未起作用的结果 连接是错误的,我相信,我不知道如何修复它们或这样做的权利 在这个查询中,我试图获得分配给这些活动的人员的活动详细信息,这些人员符合以下所有条件 员工和活动在分配表中链接,员工ID分配给分配表中的活动ID --在2019年期间,在某个校园教授至少2个模块 标记必须在现场标记处的示教表中至少出现两次 SPAID5或6将与校园相对应,因此此时教授两个模块和ID --管理超过1名同事 这在staff表中,Supervisor

好的,这是我提出问题的最好尝试。它当前执行,但不返回任何其他尝试未起作用的结果

连接是错误的,我相信,我不知道如何修复它们或这样做的权利

在这个查询中,我试图获得分配给这些活动的人员的活动详细信息,这些人员符合以下所有条件

员工和活动在分配表中链接,员工ID分配给分配表中的活动ID

--在2019年期间,在某个校园教授至少2个模块

标记必须在现场标记处的示教表中至少出现两次

SPAID5或6将与校园相对应,因此此时教授两个模块和ID

--管理超过1名同事

这在staff表中,SupervisorID是同一表中StaffID的外键

因此,分配给活动的员工ID需要监督多个同事,他们的ID在SupervisorID中出现多次

--相关活动是内部活动

如果活动等于1,则该活动为内部活动

因此,综上所述,只有当员工符合上述所有条件时,活动详细信息才会出现在查询结果中

SELECT Activity.AcID, Activity.Title, Activity.CaID, Activity.Internal, Activity.BuID, Budget.Amount FROM Activity


INNER JOIN Budget ON Activity.AcID = Budget.BuID
INNER JOIN Allocation ON Activity.AcID = Allocation.AcID
INNER JOIN Staff ON Allocation.StaffID = Staff.StaffID
INNER JOIN Teach ON Allocation.StaffID = Teach.StaffID

WHERE Activity.Internal=1 AND 

Allocation.StaffID IN (
SELECT Staff.SupervisorID
FROM Staff
GROUP BY StaffID
HAVING COUNT(Staff.SupervisorID=Allocation.StaffID) >1) 
 
AND Allocation.StaffID IN (
    
SELECT Teach.StaffID
FROM Teach
WHERE Teach.Year='2019' AND Teach.SpaID=5 OR 6
GROUP BY Teach.StaffID
HAVING COUNT(Allocation.StaffID=Teach.StaffID) >=2);
如果您想了解更多详细信息,请参阅下面的表详细信息

表活动--
AcID、标题、CaID、BuID、状态、开始、结束内部

表分配--
StaffID,AcID

表预算--
BuID、金额、审批人、收款人、状态

表校园--
CaID、地址、GmName、国家/地区、状态

表教室--
RmID、容量、CaID、位置、类型、状态

表模块--
ModuleID、模块名称、部门、计划、TMode、首次报价日期

表SpaceAssign--
SpaID、RmID、TID、经理、已批准

表职员--
StaffID、Title、FirstName、LastName、DeptID、CaID、Joined、LeftD、Current、Salary、ContractType、SupervisorID

表格教学--
TID、ModuleID、StaffID、SpaID、学期、年份


我已经尽了最大的努力解释了这一点,很抱歉有任何混淆。

如果没有访问数据的权限,很难判断,但是您可以尝试将
内部联接更改为
左侧联接,并且:

这个

应该是

WHERE Teach.Year='2019' AND (Teach.SpaID=5 OR Teach.SpaID=6)
这看起来也不正确:

INNER JOIN Budget ON Activity.AcID = Budget.BuID
应该是:

INNER JOIN Budget ON Activity.BuID = Budget.BuID

没有数据,很难找到解决方案。请试试这个:

SELECT Activity.AcID, Activity.Title, Activity.CaID, Activity.Internal, Activity.BuID, Budget.Amount FROM Activity


INNER JOIN Budget ON Activity.AcID = Budget.BuID
INNER JOIN Allocation ON Activity.AcID = Allocation.AcID
INNER JOIN Staff ON Allocation.StaffID = Staff.StaffID
INNER JOIN Teach ON Allocation.StaffID = Teach.StaffID

WHERE Activity.Internal=1 AND 

Allocation.StaffID IN (
SELECT Staff.SupervisorID
FROM Staff
GROUP BY SupervisorID
HAVING COUNT(*) >1) 
 
AND Allocation.StaffID IN (
    
SELECT Teach.StaffID
FROM Teach
WHERE Teach.Year='2019' AND Teach.SpaID=5 OR 6
GROUP BY Teach.StaffID
HAVING COUNT(*) >=2);

请共享示例输入数据、该示例的预期输出以及适当形式的表结构(带有列类型)。这使得重现你的问题变得更容易抱歉,我想我可能让它部分工作,并且我使用的测试数据可能是问题所在,所以我想我应该在这里结束问题,同时我整理并再次尝试修复它
SELECT Activity.AcID, Activity.Title, Activity.CaID, Activity.Internal, Activity.BuID, Budget.Amount FROM Activity


INNER JOIN Budget ON Activity.AcID = Budget.BuID
INNER JOIN Allocation ON Activity.AcID = Allocation.AcID
INNER JOIN Staff ON Allocation.StaffID = Staff.StaffID
INNER JOIN Teach ON Allocation.StaffID = Teach.StaffID

WHERE Activity.Internal=1 AND 

Allocation.StaffID IN (
SELECT Staff.SupervisorID
FROM Staff
GROUP BY SupervisorID
HAVING COUNT(*) >1) 
 
AND Allocation.StaffID IN (
    
SELECT Teach.StaffID
FROM Teach
WHERE Teach.Year='2019' AND Teach.SpaID=5 OR 6
GROUP BY Teach.StaffID
HAVING COUNT(*) >=2);