[英]How to use properly JOIN condition with Subquery in WHERE?
目前,我的架构如下所示:
CREATE TABLE IF NOT EXISTS `hours` (
`Project_ID` varchar(10) NOT NULL,
`Project_Name` varchar(50) NOT NULL,
`Res_ID` varchar(40) NOT NULL,
`Date` date NOT NULL,
`Hours` int(10) NOT NULL,
)
CREATE TABLE IF NOT EXISTS `project_resources` (
`Project_ID` varchar(10) NOT NULL,
`Res_ID` varchar(40) NOT NULL
)
//A single project Id can be assosiated with many resource id's
CREATE TABLE IF NOT EXISTS `resources` (
`Res_ID` varchar(40) NOT NULL,
`Res_Name` varchar(50) NOT NULL,
`Email` varchar(50) NOT NULL,
`Phone_Number` bigint(12) NOT NULL,
`Reporting_Manager` varchar(50) NOT NULL,
`Role` varchar(50) NOT NULL,
`Designation` varchar(50) NOT NULL,
`Password` varchar(50) NOT NULL
)
在这里,我试图生成一个查询,使其以以下格式显示数据,
资源名称| 总和(小时)。
我尝试执行以下查询
SELECT res_name,sum(hours) FROM hours h
INNER JOIN resources r ON h.res_id=r.res_id
WHERE r.res_id = (SELECT res_id FROM `project_resources` WHERE project_id='someproject')
我知道这将返回子查询返回多于1行的错误。 但是我只是想知道如何才能正确地执行此查询。
我想这对你有帮助
Select res_name,sum(hours)
from hours h inner join resources r on h.res_id=r.res_id
where r.res_id IN (
SELECT res_id
FROM `project_resources`
WHERE project_id='someproject'
)
如果您的子查询返回1行以上,则可以在where语句中使用'IN'子句
你可以使用in
:
Select res_name,sum(hours)
from hours h inner join
resources r
on h.res_id = r.res_id
where r.res_id in (SELECT res_id
FROM `project_resources`
WHERE project_id = 'someproject'
);
但是,我可能建议仅执行多个连接:
Select res_name,sum(hours)
from hours h inner join
resources r
on h.res_id = r.res_id inner join
project_resources pr
on pr.res_id = r.res_id and pr.project_id = 'someproject'
当然,如果project_resources
表中有重复项,则此操作将无效。
您正在选择(也)“ someproject”中使用的所有项目及其资源的总时数。 由于可能有一个以上的资源与“ someproject”相关联,因此请使用IN来获取所有资源。 然后 ...
所以:
SELECT
res_name,
sum(hours)
FROM hours h
INNER JOIN resources r ON h.res_id=r.res_id
WHERE r.res_id IN
(
SELECT res_id
FROM `project_resources`
WHERE project_id='someproject'
)
GROUP BY res_id;
要么:
SELECT
GROUP_CONCAT(res_name) AS res_names,
sum(hours)
FROM hours h
INNER JOIN resources r ON h.res_id=r.res_id
WHERE r.res_id IN
(
SELECT res_id
FROM `project_resources`
WHERE project_id='someproject'
);
因此,基本上,您想展示两件事:
在您的Res_ID
位于project_resources
表中且项目ID为'someproject'
。
对?
然后,将这个问题分为三个小部分:
第1部分:
要获取资源的名称,您应该编写:
SELECT rs.Res_Name
FROM resources rs
请注意, rs
是表resources
别名的名称。
好?
现在开始-2:
要获得资源工作的总小时数,您应该编写:
SELECT SUM(Hours)
FROM hours h
基本上, h
是表hours
的别名。 我想你明白了吧?
最后, 第3部分:
您的Project_ID
应该是'someproject'
。
另外, Res_ID
应该在project_resources
内部。
现在,让我们将所有部分结合在一起。 现在我们得到:
SELECT r.Res_Name, SUM(Hours)
FROM hours h
INNER JOIN resources r ON h.Res_ID = r.Res_ID
INNER JOIN project_resources pr ON r.Res_ID = pr.Res_ID
WHERE pr.Project_ID = 'someproject'
基本上,在这里我们第一次参加hours
与resources
鉴于Res_ID
是两个表中一样,我们也加入了表resources
与project_resources
鉴于Res_ID
是两个表中相同,且Project_ID
的hours
是'someproject'
。
希望这会给您您想要的。 你有主意吧?
但是,请注意。 我注意到您在表hours
使用了相同的名称,并且它是Hours
列。 尽管由于名称上的大小写不同,这不会造成任何问题,但这实际上不是一个好习惯。 您应该为您的列考虑一个不同的有意义的名称,以避免混淆和任何不希望出现的情况。 享受编码!!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.