繁体   English   中英

如何在WHERE中对子查询正确使用JOIN条件?

[英]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来获取所有资源。 然后 ...

  • 可以按res_name分组(假设它是唯一的,否则使用res_id)以每个ressource的形式获取结果记录
  • 从结果中删除res_name(因为有不止一个,则您只会随机显示其中之一)
  • 使用GROUP_CONCAT生成包含所有资源名称的字符串

所以:

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'
);

因此,基本上,您想展示两件事:

  1. 资源名称
  2. 资源工作的总小时数

在您的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'

基本上,在这里我们第一次参加hoursresources鉴于Res_ID是两个表中一样,我们也加入了表resourcesproject_resources鉴于Res_ID是两个表中相同,且Project_IDhours'someproject'

希望这会给您您想要的。 你有主意吧?

但是,请注意。 我注意到您在表hours使用了相同的名称,并且它是Hours列。 尽管由于名称上的大小写不同,这不会造成任何问题,但这实际上不是一个好习惯。 您应该为您的列考虑一个不同的有意义的名称,以避免混淆和任何不希望出现的情况。 享受编码!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM