MySQL过滤另一个表

时间:2011-12-27 23:02:34

标签: mysql join filtering

我知道这是可能的我只是不知道如何编码或如何短语来搜索我需要的答案。我很确定我需要使用JOIN但是我发现很难找到一个例子来获得正确的语法。


我有3张桌子。事件表,包含在不同计算机上发生的事件及其时间。因此,出于问题目的,事件有4个字段:
活动

  • event_id(主键,auto_increment)
  • machine_id(外键)
  • time_in
  • TIME_OUT
  • 然后我有一个表“机器”列出所有机器:

  • id(key)
  • 名称
  • department_id(外键)
  • 然后最后我有部门表:
    DEPARTMENTS

  • id(key)
  • 名称
  • 我想选择部门中发生的所有事件。所以说我希望发生事件的机器的department_id所发生的事件中的所有事件都是= 1.

    4 个答案:

    答案 0 :(得分:4)

    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但知道部门的名称,您可以进行额外的JOIN并使用部门名称:

    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'
    

    答案 1 :(得分:3)

    您可以使用此

    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
    

    请注意,我不需要加入部门,但出于性能原因,您应该通过这种方式搜索主键,该主键具有聚簇索引,因此速度更快

    答案 2 :(得分:2)

    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语法。 For more info about inner joins vs Cartesian product

    答案 3 :(得分:0)

    使用联接。

    SELECT events.* FROM events INNER JOIN machines ON machines.id = events.machine_id WHERE department_id = 1