MySQL 5.6 Select 声明

MySQL 5.6 Select Statement

出于某种原因,我似乎无法弄清楚这个问题,尽管我知道答案可能就在眼前。

我有两个表,DEVICESDEVICE_OWNER

这里的关系是一对多的。

DEVICES 列是 pk_device_idDEVICE_OWNER 列是 fk_device_id, assigned_date, and fk_staff_id

我正在尝试创建一个视图,该视图将显示所有设备以及基于 assigned_date 的最后一个 fk_staff_ID。我根据本网站上的其他答案写了这个视图,它完全显示了我想要的内容,但是 MySQL 不允许我将其保存为视图,有人可以提供任何建议吗?

SELECT
    deow.fk_staff_id,
devices.*
FROM
    devices_owner deow
INNER JOIN (
    SELECT
        fk_device_id,
        MAX(assigned_date) AS MaxDateTime,
        fk_staff_id
    FROM
        devices_owner
    GROUP BY
        FK_DEVICE_ID
) groupeddeow ON deow.FK_DEVICE_ID = groupeddeow.fk_device_id
AND deow.ASSIGNED_DATE = groupeddeow.MaxDateTime
RIGHT JOIN devices ON devices.PK_DEVICE_ID = deow.FK_DEVICE_ID

这个版本应该在 FROM 子句中没有子查询的情况下工作

SELECT `do`.fk_staff_id
FROM devices AS `d`
LEFT JOIN devices_owner AS `do` ON `d`.pk_device_id = `do`.fk_device_id
WHERE `do`.fk_device_id IS NULL
  OR (`do`.fk_device_id,  `do`.assigned_date) 
     IN (SELECT fk_device_id, MAX(assigned_date)
         FROM devices_owner
         GROUP BY fk_device_id
        )
;

OR 可能(很可能会)损害性能,因此您可能希望 UNION 查询的两个版本(每个条件一个)...假设 VIEW 对这些也没有限制.


编辑:详细说明这个条件...

(`do`.fk_device_id,  `do`.assigned_date) 
   IN (SELECT fk_device_id, MAX(assigned_date)
       FROM devices_owner
       GROUP BY fk_device_id
      )

当子查询的结果集包含与外部查询的候选结果行中的值完全匹配的结果行​​时,此计算结果为真。

这是这种逻辑的变体(示例从简单到复杂):

  • 1 IN (1, 2, 3) => 真,4 IN (1, 2, 3) => 假
  • (1,2) IN ((1,1),(1,2),(1,3)) => true, (2,1) IN ((1,1),(1, 2),(1,3)) => 假
  • 1 IN ((1,1),(1,2),(1,3)) => 可能是错误的(充其量是错误的)

所阐述的条件基本上只是将这些示例右侧的值列表替换为将被视为此类列表的子查询。