Mysql查询在两个表之间搜索没有直接关系

时间:2015-01-30 03:59:18

标签: mysql

好吧,我发现自己陷入了死胡同,我知道必须是一种方式,但我的大脑即将爆炸。情况就是这样:我有两个包含大量行的表,一个用于完成的工作(让我们称之为工作表),如下所示:

ID | Home_Work_ID | task_id | Person_id
1  | 23           | 1       | 30
2  | 23           | 2       | 31
3  | 23           | 3       | 30
4  | 876          | 1       | 31
5  | 123          | 3       | 32

和另一个报告前面提到的修复工作的表,让我们称之为修复表

ID | Home_Work_ID | Person_reporting_id | Task_id | Details
1  | 23           | 93                  | 1       | Fix this
2  | 23           | 85                  | 3       | Fix that
3  | 123          | 86                  | 3       | Fix something

正如我们所看到的,在修复表中有报告修复的家庭作品,这些家庭作品由person_id 30和32(来自工作表)完成。我试图实现的结果将是:

Person                               | Fixes 
John (lets say this is person id 30) | 2
Kate (lets say this is person id 32) | 1

问题是,我需要创建一个报告,向我展示谁是负责工作表中已完成工作的人,该工作表已在第二个表中报告了修复,以及为该人报告了多少修复。唯一的链接是家庭工作ID,可能是任务ID,所以我正在测试这样的东西

SELECT P.person_name AS Person, COUNT(F.id) AS fixes 
FROM fixes F 
INNER JOIN homeworks H ON F.home_work_id = H.id 
INNER JOIN works as W 
INNER JOIN people AS P ON W.person_id = P.id 
INNER JOIN tasks AS T ON T.task_id = F.task_id
WHERE F.task_id = W.task_id 
AND F.home_work_id = W.home_work_id 
AND W.home_work_id IN (SELECT home_work_id FROM fixes GROUP BY home_work_id) 
GROUP BY P.person_name ORDER BY fixes DESC

好的还有三个内/左连接表,其中包含人员,家庭工作和任务的ID和名称。这告诉我负责人但是那个人的修复数量和home_work / task与修复表中的那些不匹配,我想我做错了内部加入工作表那样但我还没看到光。任何帮助都将非常感激。

此致

2 个答案:

答案 0 :(得分:1)

我认为这个查询应该会给你预期的结果:

SELECT P.Person_name AS Person, COUNT(F.id) AS fixes 
FROM works W
INNER JOIN fixes F ON W.home_work_id = F.home_work_id and W.task_id=F.Task_id
INNER JOIN people P ON W.person_id = P.id
group by P.Person_name
  然而,因为我没有深入阅读这个问题,所以我不确定   100%这将给出确切的结果。

编辑:问题所有者撰写了答案below的确切查询。

答案的所有者注意:检查查询,基于它,但不是"确切的"查询。

答案 1 :(得分:1)

好的做了一些测试后,感谢来自dba.stackexchange的Farhang Amary和Rick James的评论,以下查询似乎可以完成这项工作,所以我在这里发布给任何发现自己处于相同情况或任何事情的人可以固定在它上面:

SELECT P.Person_name AS Person, COUNT(F.id) AS fixes
FROM (SELECT person_id, home_work_id, task_id FROM work) W
  LEFT JOIN fixes_table F ON W.home_work_id = F.home_work_id AND W.task_id = F.taks_id
  LEFT JOIN People_table P ON W.person_id = P.id
GROUP BY P.person_name ORDER BY fixes DESC;