【问题标题】:MySQL How To Retrieve Table Name As A FieldMySQL如何将表名作为字段检索
【发布时间】:2011-11-27 23:33:01
【问题描述】:

我不确定如何准确地表达我的问题,但我会尽力而为。我正在尝试为驾驶学校建模数据库。我有一个“时间段”表,这样课程、测试和注册面试等活动都可以链接到工作人员的给定时间段。我提供的查询之一是能够查看工作人员的事件“时间表”。我已经构建了查询并且它正在工作,但是它连接了来自其他各种表的数据,我想查看这些表的名称以了解时间段保留用于哪些活动。

ER Model

我为检查员工时间表而执行的查询如下:

SELECT Timeslot.*
FROM Timeslot
LEFT JOIN Test
ON Timeslot.Timeslot_ID = Test.Timeslot
LEFT JOIN Interview
ON Timeslot.Timeslot_ID = Interview.Timeslot
LEFT JOIN Lesson
ON Timeslot.Timeslot_ID = Lesson.Timeslot
WHERE Timeslot.Date BETWEEN CURDATE() AND (CURDATE() + INTERVAL 7 DAY)
AND Timeslot.Staff = 1;

这有效并显示下周给定工作人员的所有已注册时间段的列表。我想要的是另一个列,它会显示它是什么类型的活动,例如“课程”、“面试”或“测试”。如您所见,我目前将其作为字段存储在时间段表中,这意味着我每次插入时间段时都必须指定它。我会将数据库规范化为 3NF,并希望避免重复。有没有一种方法可以让我建模来获取表的名称,我考虑过使用 UNIONS 和许多其他东西,但可以使用一些帮助。

如果这看起来有点含糊,非常感谢和道歉。 迈克

【问题讨论】:

    标签: mysql database database-design entity-relationship


    【解决方案1】:

    如果您保留您所描述的模型,我会尝试使用 Case 语句,如下所示:

    Select Timeslot.*,
        Case
            When Test.Timeslot Is Not Null Then 'Test'
            When Interview.Timeslot Is Not Null Then 'Interview'
            When Lesson.Timeslot Is Not Null Then 'Lesson'
        End As ActivityType
    From ...
    

    您的查询将在最后有一个“ActivityType”列供您使用。

    【讨论】:

    • 没有内连接,所以只能匹配三个中的一个。其他任何内容都是重复预订,将作为重复行返回。
    • 完美,正是我想要的。避免不必要的重复。我不知道案例陈述,将进一步调查。非常感谢
    • 有什么区别让他们中的多少产生结果?这个想法是它们中的 0 到 3 个将产生结果,并且这些行将混合在一起。 case 语句只是根据每行确定加入了哪个表。对我来说似乎很清楚,所以我很难弄清楚你在说什么。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多