【问题标题】:MySQL: query optimization - how to store query result in variableMySQL:查询优化 - 如何将查询结果存储在变量中
【发布时间】:2014-09-02 20:14:53
【问题描述】:

我有表用户、活动(公共、私人或秘密类型)、服务员、组织者,我需要选择用户 1 是服务员或组织者的所有活动,除了秘密活动,其中用户 2 不是(参加或组织者或受邀)。

这个巨大的 SELECT 可以满足我的所有需要​​,但它包含许多其他 SELECT。 是否可以以某种方式对其进行优化,例如将由 cmets 从这里到这里的联合体放入某种变量并重新使用它?

编辑:当时我需要能够处理更多这些请求。

SELECT `event`.id AS eventid, event.name AS ename
FROM attendant
INNER JOIN user ON attendant.fk_user = user.id
INNER JOIN event ON attendant.fk_event = `event`.id
WHERE user.id = 2
AND attendant.fk_event = `event`.id
AND `event`.id IN
-- FROM HERE
(
SELECT `event`.id
FROM attendant
INNER JOIN user ON attendant.fk_user = user.id
INNER JOIN event ON attendant.fk_event = `event`.id
WHERE user.id = 1
AND attendant.fk_event = `event`.id

UNION

SELECT `event`.id
FROM organizer
INNER JOIN user ON organizer.fk_user = user.id
INNER JOIN event ON organizer.fk_event = event.id
WHERE user.id = 1
AND organizer.fk_event = event.id

UNION

SELECT `event`.id
FROM invitation
INNER JOIN user ON invitation.fk_user_to = user.id
INNER JOIN event ON invitation.fk_event = event.id
WHERE invitation.fk_user_to = 1
AND invitation.fk_event = event.id)
-- TO HERE

UNION

SELECT `event`.id AS eventid, event.name AS ename
FROM organizer
INNER JOIN user ON organizer.fk_user = user.id
INNER JOIN event ON organizer.fk_event = event.id
WHERE user.id = 2
AND organizer.fk_event = event.id
AND `event`.id IN
(
-- FROM HERE
SELECT `event`.id
FROM attendant
INNER JOIN user ON attendant.fk_user = user.id
INNER JOIN event ON attendant.fk_event = `event`.id
WHERE user.id = 1
AND attendant.fk_event = `event`.id

UNION

SELECT `event`.id
FROM organizer
INNER JOIN user ON organizer.fk_user = user.id
INNER JOIN event ON organizer.fk_event = event.id
WHERE user.id = 1
AND organizer.fk_event = event.id

UNION

SELECT `event`.id
FROM invitation
INNER JOIN user ON invitation.fk_user_to = user.id
INNER JOIN event ON invitation.fk_event = event.id
WHERE invitation.fk_user_to = 1
AND invitation.fk_event = event.id);
-- TO HERE

【问题讨论】:

  • 如果它起作用了,这可能应该继续进行 CodeReview 左右......
  • @user2366842 我宁愿寻找技巧,如何将查询结果存储在某种“变量”中(我知道普通变量不可能),这就是我使用这个网站的原因。

标签: mysql optimization query-optimization


【解决方案1】:

我建议创建视图以获取中间结果并重用它们。

视图很便宜:数据不存储,您可以在选择中使用它们。

以你为例:

create view viewname_1 as SELECT event.id FROM invitation INNER JOIN user ON invitation.fk_user_to = user.id INNER JOIN event ON invitation.fk_event = event.id WHERE invitation.fk_user_to = 1 AND invitation.fk_event = event.id AND (event.type = 'secret' OR event.type = 'private' OR event.type = 'public') )`

以后使用 viewname_1 作为 select * from viewname_1...

显然,您可以为视图选择自己的命名约定:只需注意命名空间。

【讨论】:

  • 我发现这不是我所需要的。当我创建一个视图并使用它时,另一个请求可能会重写它并破坏我的查询。
  • 等一下:你应该只创建一次视图。能否请您发布整个 SQL?
  • 我认为我不应该发布整个 1000 行 SQL。 :) 我需要在每次查询数据库之前得到这个结果,然后使用它。请问有什么想法吗?
  • 不存储视图查询的结果。是直播内容。如果您根据视图的连接进行选择,您的查询不会受到影响。如果我能得到一个活生生的例子,我可以提供更多帮助。它不需要在这里发布
  • 请再次查看我编辑的问题,主要是粗体部分和代码。还使用pastebin.com/LWW2uSe1 和一些约束创建数据库。我希望它有助于理解这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2014-04-24
相关资源
最近更新 更多