MySQL 5.6选择语句

时间:2017-05-12 14:51:19

标签: mysql views

出于某种原因,即使我知道答案可能正在盯着我,但我似乎无法弄清楚这一点。

我有两个表,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

1 个答案:

答案 0 :(得分:0)

此版本应该在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两个版本的查询(每个条件一个)...假设VIEWs也没有限制。< / p>

编辑:详细说明这种情况......

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

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

这是对这种逻辑的一种变化(从最简单到更复杂的例子):

  • 1 IN(1,2,3)=&gt;是的,4 IN(1,2,3)=&gt;假
  • (1,2)IN((1,1),(1,2),(1,3))=&gt; true,(2,1)IN((1,1),(1,2),(1,3))=&gt;假
  • 1 IN((1,1),(1,2),(1,3))=&gt;可能是错误(最好是假的)

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