我需要执行查询、保存结果并在一个会话中多次重复使用它(类似于WITH
Oracle DB)。
这是我要保存的查询:
SELECT `event`.id, event.name
FROM attendant
INNER JOIN event ON attendant.fk_event = event.id
WHERE attendant.fk_user = 1
UNION
SELECT `event`.id, event.name
FROM organizer
INNER JOIN event ON organizer.fk_event = event.id
WHERE organizer.fk_user = 1
UNION
SELECT `event`.id, event.name
FROM invitation
INNER JOIN event ON invitation.fk_event = event.id
WHERE invitation.fk_user_to = 1
然后执行多个查询,如
SELECT id FROM savedquery WHERE .....
UNION
SELECT id FROM savedquery WHERE .....;
我找到了TEMPORARY TABLEs
,但我不认为我可以使用它,因为我需要在多个不同的用户运行事件请求时为他们执行此查询。
VIEW
也被命名,所以我想也有同样的问题。
请问最好的解决方案是什么?
正如你所说,临时表只在会话内可见,物化视图在MySQL中不可用。有几种选择(包括您提到的那些)。我会将您的原始查询命名为
SELECT ...
:WITH
Oracle 关键字等同于CREATE TEMPORARY TABLE
:您必须为每个连接创建它。
A
VIEW
在连接之间共享,但它不是实际的表 - 它可以通过两种方式执行,通过在执行开始时创建临时表或通过执行相应的子查询:如果您使用的是 5.6,子查询算法可能会更好,但这是在不知道实际查询的情况下。
由于实体化视图不是一个选项,您可以通过创建一个真实的表来模拟它们,该表将在连接之间共享:
这样做的问题是它不会自动更新(您必须使用触发器或任何其他方式来做到这一点);积极的是您可以添加索引(与视图不同)。
问题是你的原始查询和你的派生查询可能不会非常有效,你可能可以修改它以更好地执行,但这是另一个问题......