MySQL:通过"内部加入"添加更多表格结果为空ResultSet

时间:2015-01-19 12:45:26

标签: mysql join

首先:抱歉,查询中的关键字是德语。我将提供每个关键字的解释,以便您轻松了解该问题。

我的数据库由4个表组成:

mitarbeiter (MA_ID,姓名......) 包含员工数据。相关的是ID和名称(分隔的名字和姓氏)

stunden_auftrag (MA_ID,gesamt ...) 包含员工必须为项目工作的工作时间。由employee-id标识。对于此查询,仅总量(gesamt)很重要

stunden_geleistet (MA_ID,gesamt ...) 和已经工作的时间一样。

auftrag (MA_ID,von,bis ......) 包含订单运行多长时间。 (von表示startdate,bis表示enddate)

以下查询的目的是向我展示在接下来的31天内订单终止的所有员工。

我提出的查询是:

`SELECT  mitarbeiter.MA_ID, 
     mitarbeiter.nachname, 
     mitarbeiter.vorname,
     auftrag.von, 
     auftrag.bis, 
     DATEDIFF(auftrag.bis, CURRENT_TIMESTAMP) AS Resttage
FROM mitarbeiter
INNER JOIN auftrag ON mitarbeiter.MA_ID = auftrag.MA_ID
HAVING Resttage >= '0' AND Resttage <= '31';`    

此查询为我提供了所需的Resultset。现在我想为查询添加另一个要求。它不仅应该显示订单即将终止的员工,还应该只显示只有不到10%的订购工作时间的员工。 (某事如“hoursbooked - hoursworked <= hoursbooked*0.1”)

为此,我必须为包含工作时间的两个表添加连接:

`SELECT mitarbeiter.MA_ID,
mitarbeiter.nachname,
mitarbeiter.vorname,
auftrag.von, 
auftrag.bis, 
DATEDIFF(auftrag.bis, CURRENT_TIMESTAMP) AS Resttage,
FROM mitarbeiter
INNER JOIN auftrag ON mitarbeiter.MA_ID = auftrag.MA_ID
INNER JOIN stunden_geleistet ON auftrag.MA_ID = stunden_geleistet.MA_ID
INNER JOIN stunden_auftrag ON stunden_geleistet.MA_ID =   stunden_auftrag.MA_ID
HAVING Resttage >= '-31' AND Resttage <= '31';`    

我知道此查询尚未过滤此要求,因为我已经使用此查询获得了一个空结果集。只添加联接使得Resultset为空,尽管肯定有至少一个虚拟员工满足要显示的所有要求。

示例数据:

表“mitarbeiter”

MA_ID nachname vorname 1 Simpson Homer

表“auftrag”

MA_ID von bis 1 2014-01-01 2015-01-31

表“stunden_gebucht”

MA_ID gesamt 1 1200

表“stunden_geleistet”

MA_ID gesamt 1 1100

据我了解,由于满足查询条件,应显示该员工。但ResultSet为空。我没有得到任何语法错误,我认为我的Join结构也是正确的。你知道错误是什么吗?

提前致谢!

祝你好运, joermunG

1 个答案:

答案 0 :(得分:0)

您可以尝试此查询:

SELECT mitarbeiter.MA_ID,
mitarbeiter.nachname,
mitarbeiter.vorname,
auftrag.von, 
auftrag.bis, 
DATEDIFF(auftrag.bis, CURRENT_TIMESTAMP) AS Resttage,
FROM mitarbeiter
INNER JOIN auftrag ON mitarbeiter.MA_ID = auftrag.MA_ID
INNER JOIN stunden_geleistet ON auftrag.MA_ID = stunden_geleistet.MA_ID
INNER JOIN stunden_auftrag ON stunden_geleistet.MA_ID =   stunden_auftrag.MA_ID 
where DATEDIFF(auftrag.bis, CURRENT_TIMESTAMP) between -31 and 31