【问题标题】:MySQL: Adding more tables via "Inner Join" results in empty ResultSetMySQL:通过“内部联接”添加更多表会导致空结果集
【发布时间】:2015-01-19 12:45:26
【问题描述】:

首先:很抱歉查询中的关键字是德语。我将对每个关键字进行解释,以便您轻松理解问题。

我的数据库包含 4 个表:

mitarbeiter(MA_ID、姓名……) 包含员工数据。相关的是 ID 和姓名(名字和姓氏分开)

stunden_auftrag(MA_ID, gesamt…) 包含员工必须为项目工作的工作时间。由员工 ID 标识。对于这个查询,只有总量(gesamt)很重要

stunden_geleistet(MA_ID, gesamt…) 和以前一样,已经工作了。

auftrag(MA_ID、von、bis…) 包含订单运行时间的日期。 (von 表示开始日期,bis 表示结束日期)

以下查询的目的是向我显示订单在未来 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';`    

这个查询给了我想要的结果集。现在我想向查询添加另一个要求。它不仅应显示订单将要终止的员工,还应显示仅剩不到 10% 的已订购工作时间的员工。 (比如“hoursbooked - hoursworked &lt;= 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';`    

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

样本数据:

表“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 结构也是正确的。你知道错误是什么吗?

提前致谢!

最好的问候, 乔尔蒙

【问题讨论】:

    标签: mysql join


    【解决方案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 
    where DATEDIFF(auftrag.bis, CURRENT_TIMESTAMP) between -31 and 31
    

    【讨论】:

    • @joermunG 如果将 where 语句替换为 mitarbeiter.MA_ID=1 会得到预期的结果吗?
    • 我发现了错误。这真的很尴尬,但是“二”日期有错字,所以范围不在 -31 到 31 天之间。对不起,我不得不打扰你。您的查询完美运行。无论如何感谢您的帮助,因为我通过执行您的最后一个提示找到了错字:)
    猜你喜欢
    • 2013-01-31
    • 2011-01-10
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多