MySQL按一个表过滤另一个表

MySQL按一个表过滤另一个表,mysql,join,filtering,Mysql,Join,Filtering,我知道这是可能的,我只是不知道如何使用代码或如何表达它来搜索我需要的答案。我非常确定我需要使用JOIN,但是我发现很难找到一个示例来获得正确的语法 我有三张桌子。事件表,其中包含在不同计算机上发生的事件及其时间。因此,出于提问目的,事件有4个字段: 事件 事件id主键,自动递增 机器id外键 时间到了 暂停 然后,我有一个表机器,其中列出了所有机器: 机器 id密钥 名称 部门id外键 最后是部门表: 部门 id密钥 名字 我要选择部门中发生的所有事件。因此,假设我想要事件中发生事件的机器的部

我知道这是可能的,我只是不知道如何使用代码或如何表达它来搜索我需要的答案。我非常确定我需要使用JOIN,但是我发现很难找到一个示例来获得正确的语法

我有三张桌子。事件表,其中包含在不同计算机上发生的事件及其时间。因此,出于提问目的,事件有4个字段: 事件 事件id主键,自动递增 机器id外键 时间到了 暂停

然后,我有一个表机器,其中列出了所有机器: 机器 id密钥 名称 部门id外键

最后是部门表: 部门 id密钥 名字

我要选择部门中发生的所有事件。因此,假设我想要事件中发生事件的机器的部门id为=1的所有事件

SELECT E.event_id, E.machine_id, E.time_in, E.time_out
FROM EVENTS E
INNER JOIN MACHINES M ON E.machine_id=M.machine_id
WHERE M.department_id = 1
顺便说一句,如果您不知道部门id,但知道部门名称,您可以进行其他加入并使用部门名称:

SELECT E.event_id, E.machine_id, E.time_in, E.time_out
FROM EVENTS E
INNER JOIN MACHINES M ON E.machine_id=M.machine_id
INNER JOIN DEPARTMENTS D ON M.department_id=D.department_id
WHERE D.Name = 'Accounting'
使用连接

选择事件。*从事件内部加入机器上的机器。id=events.machine\u id,其中department\u id=1

SELECT event_id, events.machine_id, time_in, time_out
FROM events 
     INNER JOIN machines ON events.machine_id = machine.id
     INNER JOIN departments ON machines.departments_id = departments.id
WHERE departments.id = 1
请注意,我不需要加入部门,但出于性能原因,您应该这样做,这样您总是在搜索主键,主键具有聚集索引,因此速度更快

SELECT e.* FROM events AS e, machines as m 
WHERE e.machine_id = m.id AND department_id = x;
或者如果你有部门名称

SELECT e.* FROM events AS e, machines as m, departments as d 
WHERE e.machine_id = m.id AND m.department_d = d.id AND d.name = x;

这是笛卡尔积方法。你也可以使用内部连接来回答其他问题。内部联接的可读性更高,ANSI语法也更好

您指的是发生在的哪一事件?不在任何表的字段列表中,如果您能给我一个在计算机上发生的事件id列表,那就太完美了。还有很多其他的数学运算与过滤器无关。更重要的是,我要报告每个部门的报告时间。部门由其中的机器定义。因此,事件表是用带有时间戳的机器id写入的。我在机器上找到时间戳的时间差,我可以得到总时间。我想做的是只为id=1的单个部门报告时间