加入后如何从多个表格中选择?

时间:2019-01-31 20:05:49

标签: mysql

我尝试使用table_X内部连接多个表(table_A,table_B和table_C)。使用LIKE从其他表(table_Y)中选择table_X。 table_X需要很长时间才能创建。我如何有效地完成任务?

当前,我对table_A进行以下查询。并对table_B和Table_C重复该过程。

SELECT * FROM 
Table_A INNER JOIN
(SELECT ID FROM table_Y where ID LIKE "%keyword%") as table_X
USING (ID)

由于创建table_X需要花费大量时间,因此我想在一个查询中从table_A,table_B和table_C中进行选择。我该怎么做?

需要注意的几件事:

  • 我的预期结果是三个单独的表,而不是一个组合表。

  • 我没有在数据库中创建临时表的权限。

1 个答案:

答案 0 :(得分:1)

查询返回的结果集不是表,而查询只能返回单个结果集。 您将需要三个独立的查询来获得您想要的结果。

如果你的核心目标是降低你的TABLE_X子查询的费用,你可以创建一个临时表来存储TABLE_X子查询的结果,然后再加入到该表与表-A,表-B和table_C查询。

编辑,事情要记住:

TEMPORARY表是仅通过在它们所创建的连接可见的,并且会自动当连接闭合下降;但如果重新使用连接(例如从连接池中),该连接仍将保持不变,因此,将其明确删除仍然是一个好习惯。真正的临时表也对它们是如何被使用的限制,最明显的是,他们只能在任何给定的查询中引用次(无自我连接,或者连接到多个引用,或有多个部分引用相同表的工会)。< / p>

假设你具有适当的权限,则可以创建正常表您想要成品何时丢弃;但必须小心,因为这样的表一般可以通过所有连接可以看到和断开不会“清理”这样的表。它们可以执行得更好,并且没有真正的临时表的限制,但是您需要权衡风险与收益。


如果你没有任何创建表的权限,大部分数据处理正在发生的客户端,你不要指望从昂贵的子查询巨大的成绩,你可以先收集子查询结果和动态建筑使用它们以后的查询。

非常伪代码:

query: SELECT ID FROM table_Y WHERE [expensive condition(s)];
code: convert ID values received into a comma separated list
query: SELECT [stuff] FROM Table_A WHERE ID IN ([ID values from expensive query]);
query: SELECT [other_stuff] FROM Table_B WHERE ID IN ([ID values from expensive query]);
query: SELECT [more_stuff] FROM Table_C WHERE ID IN ([ID values from expensive query]);