【问题标题】:MySQL Filter One Table By AnotherMySQL 逐个过滤一个表
【发布时间】:2012-01-28 19:50:03
【问题描述】:

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


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

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

  • id(键)
  • 姓名
  • department_id(外键)
  • 最后我有 Department 表:
    部门

  • id(键)
  • 姓名
  • 我想选择一个部门中发生的所有事件。所以说我想要事件发生的机器的department_id = 1的事件中的所有事件。

    【问题讨论】:

    • 您指的是哪个“事件发生在”?不在您的任何表格的字段列表中
    • 如果你能给我一份在完美机器上发生的 event_id 的列表。还有很多其他的数学运算与过滤器无关。更大的图景是我报告每个部门的时间报告量。部门由其中的机器定义。因此,事件表使用带有时间戳的 machine_id 写入。我在机器上找到时间戳的时间差异,我可以获得总时间。我正在尝试做的只是为 id=1 的单个部门报告的时间

    标签: mysql join filtering


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

    【讨论】:

      【解决方案2】:

      你可以用这个

      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
      

      请注意,我不需要加入部门,但出于性能原因,您应该这样做,这样您总是在搜索具有聚集索引的主键,因此速度更快

      【讨论】:

        【解决方案3】:

        使用连接。

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

        【讨论】:

          【解决方案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'
          

          【讨论】:

            猜你喜欢
            • 2016-07-21
            • 2018-06-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-29
            • 1970-01-01
            相关资源
            最近更新 更多