保存select结果以便在另一个select中重用

ztyzrc3y  于 2021-06-25  发布在  Mysql
关注(0)|答案(4)|浏览(305)

有没有办法不将sql请求的结果保存为数组,而是保存为表对象,以便在其他sql请求中重用?
例如,让我保存请求的结果 (books tagged with 'c++') ```
SELECT BOOK
FROM BOOK_TAGS
WHERE TAG = 'C++';

然后,对于选择带有标记“c++”和“gamedev”的书籍,我不想再次滚动所有的book\u标记表,我想从以前保存的结果中选择它们
像这样的

SELECT BOOK
FROM $TAGGED JOIN BOOK_TAGS USING(BOOK)
WHERE TAG = 'gamedev';

dddzy1tm

dddzy1tm1#

我不知道你的意思,但所有来自sql的请求都是表对象

SELECT BOOK FROM BOOK_TAGS WHERE TAG = 'C++' AND TAG = 'gamedev';

只给你两个标签的书

wko9yo5t

wko9yo5t2#

可以使用表变量,但为什么不合并到一个查询中呢?您的查询优化器应该执行以下工作,以确保它不会低效:

SELECT BOOK
FROM BOOK_TAGS
WHERE 
    TAG = 'C++' 
    OR
    TAG = 'gamedev'

你好像也漏掉了什么。你的意思是从 BOOKS 具有多对多关系的表 TAGS table(带 BOOK_TAGS 作为联接表)?

lzfw57am

lzfw57am3#

您可以通过创建一个表来临时保存几乎所有的结果。
最简单的方法是:

CREATE TEMPORARY TABLE `blah` 
SELECT ....
;

这种方法的好处是,临时表仅在当前数据库连接上可见,并在连接关闭时自动清除。但是,它们不能像普通表那样自由地使用(没有自联接,不能在联合中引用两次,等等…)
您可以使用非临时表,但它们在连接之间是可见的,因此您可能会有多个客户端同时操作它们的风险,而且它们是持久的,因此您必须确保自己清理它们(并且在连接丢失后也会正确清理它们)。
这两种方法的缺点都是没有自动索引,因此通常在创建此类“缓存”表时必须更加正式,然后使用 INSERT .... SELECT . 通常,在这一点上,它变得比它的价值更麻烦,除非您要经历所有这些来修复现有单个查询中的性能问题。
对于像您介绍的那样简单的查询,像这样保存结果通常没有真正的好处。

ercv8c1e

ercv8c1e4#

我在评论中陷入了xy问题,但当我看到其他一些答案时,我重新考虑了这个问题:
如果你的目标是归还所有带有两个标签的书。。。

SELECT book
FROM book_tags
WHERE tag in ('C++', 'gamedev')
GROUP BY Book
HAVING count(Distinct tag) =2

注意:我使用distinct,以防一个标签可以复制一本书;如果表设计防止了这种重复,那么不应该使用distinct。
或:
基于第一个查询创建一个视图
创建一个包含结果的表(这样结果就不会像在视图中那样改变)
.

Create table RandomKey as (
SELECT BOOK 
 FROM BOOK_TAGS
 WHERE TAG = 'C++');

后来呢

SELECT BOOK 
FROM randomkey JOIN BOOK_TAGS USING(BOOK)
WHERE TAG = 'gamedev';

但我不喜欢这样在飞行中改变结构。

相关问题