保存SELECT结果以便在另一个SELECT中重复使用

时间:2018-05-09 18:33:19

标签: php mysql sql

有没有办法将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'; 

4 个答案:

答案 0 :(得分:1)

我在评论中遇到了XY问题,但当我看到其他一些答案时,我重新考虑了这个问题:

如果您的目标是返回所有包含两个标签的图书......

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

注意:我使用不同的标签可以复制一本书的标签;如果表格设计阻止了这种重复,那么就不应该使用不同的。

OR:

  1. 根据第一个查询创建视图
  2. 创建一个包含结果的表格(这样结果不会像他们那样改变 在视图中
  3. 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)

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

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

只为您提供包含两个标记的图书