【问题标题】:How to store results from a query to us IN multiple queries?如何在多个查询中将查询结果存储给我们?
【发布时间】:2017-11-22 06:42:12
【问题描述】:

使用 PHP 和 Sqlite3,我有一个查询,例如:

$firstquery = "SELECT id FROM mytable WHERE critera=........";

这可以给我从 1 到 1000 个 id 的任意位置,具体取决于条件。

然后我在我的页面上的多达 40 个其他 SQL 查询中使用这个发现集。都是变体,例如:

$secondquery = "SELECT name FROM nametable WHERE nametable.id IN (".$firstquery.")";
$thirdquery = "SELECT car FROM cartable WHERE cartable.id IN (".$firstquery.")";

现在,当我有很多并且丢失了这些 $second、$third...$thirtiethquery 时,页面开始变慢,我认为不断需要一遍又一遍地运行 $firstquery 并没有帮助。

有没有办法避免一遍又一遍地运行 $firstquery ?也许以某种方式存储结果? (我尝试将结果存储为字符串并将其保存在 WHERE 中,但如果有数千个 id,则该子句的参数过多)。

感谢您的任何想法! 麦克尼文

【问题讨论】:

  • 我首先要问:其他表中没有相关的ID(作为外键)吗?无论如何,您可以从firstquery 构建一个以逗号分隔的 id 字符串,然后在 IN 子句中将此字符串与其他查询一起使用。这是避免重复firstquery 查询的一种方法。但是,我确信可以完成其他处理“调整”,尽管我必须了解更多信息才能进行任何其他优化改进。
  • 为什么不使用 JOIN 并让每个查询运行一次而不添加 $firstquery

标签: php sql sqlite


【解决方案1】:

如果第一个查询太慢以至于明显影响您的页面加载时间,您应该对其进行优化。

如果还是太慢,你必须将结果临时存储在某个地方。

如果结果可能太多,你可以简单地使用临时表(临时表在其他连接中是不可见的):

CREATE TEMPORARY TABLE FirstQueryResults AS
SELECT id FROM mytable WHERE critera=........;

SELECT name FROM nametable WHERE nametable.id IN FirstQueryResults;
...

DROP TABLE FirstQueryResults;

如果可以有很多结果,在临时表上create an index 可能是值得的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 2011-07-02
    • 2021-12-28
    • 2020-03-09
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多