有没有办法将SQL请求的结果保存为数组,而是作为表对象保存,可以在其他SQL请求中重用?
例如,让我保存请求(books tagged with 'c++')
SELECT BOOK
FROM BOOK_TAGS
WHERE TAG = 'C++';
然后,为了选择带有'c ++'和'gamedev'标签的书籍,我不想再次滚动所有BOOK_TAGS表格,我想从之前保存的结果中选择它们
像
这样的东西SELECT BOOK
FROM $TAGGED JOIN BOOK_TAGS USING(BOOK)
WHERE TAG = 'gamedev';
答案 0 :(得分:1)
我在评论中遇到了XY问题,但当我看到其他一些答案时,我重新考虑了这个问题:
如果您的目标是返回所有包含两个标签的图书......
SELECT book
FROM book_tags
WHERE tag in ('C++', 'gamedev')
GROUP BY Book
HAVING count(Distinct tag) =2
注意:我使用不同的标签可以复制一本书的标签;如果表格设计阻止了这种重复,那么就不应该使用不同的。
OR:
Create table RandomKey as (
SELECT BOOK
FROM BOOK_TAGS
WHERE TAG = 'C++');
然后再
SELECT BOOK
FROM randomkey JOIN BOOK_TAGS USING(BOOK)
WHERE TAG = 'gamedev';
但我不喜欢像这样改变结构。
答案 1 :(得分:1)
您可以通过创建一个表格来暂时保存几乎所有结果。
最简单的方法是:
CREATE TEMPORARY TABLE `blah`
SELECT ....
;
这种方式的好处是临时表仅在当前数据库连接上可见,并在关闭该连接时自动清除。但是,它们不能像普通表一样自由使用(没有自连接,不能在UNION中引用两次等)。
您可以使用非临时表,但它们在连接中是可见的,因此您可能会冒多个客户端同时操作它们的风险,并且它们是持久性的,因此您必须确保自己清理它们(并且它们在之后得到正确清理)连接损失也是如此)。
这两个方面的缺点是没有自动索引,所以通常你最终必须更正式地使用这样的"缓存"表'创建,然后使用INSERT .... SELECT
。通常,在这一点上,除非您通过所有这些来修复现有单个查询中的性能问题,否则它会变得比它值得更麻烦。
对于您提供的简单查询,保存结果通常没有任何实际好处。
答案 2 :(得分:0)
您可以使用表变量,但为什么不组合成一个查询?你的查询优化器应该做的工作是确保它效率不高:
SELECT BOOK
FROM BOOK_TAGS
WHERE
TAG = 'C++'
OR
TAG = 'gamedev'
看起来你还有什么东西要离开。您是否要从BOOKS
表中选择与TAGS
表具有多对多关系的表(BOOK_TAGS
是连接表)?
答案 3 :(得分:0)
SELECT BOOK FROM BOOK_TAGS WHERE TAG = 'C++' AND TAG = 'gamedev';
只为您提供包含两个标记的图书