Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中寻找从MySQL查询中获取多个表的策略_Php_Sql_Mysql - Fatal编程技术网

在PHP中寻找从MySQL查询中获取多个表的策略

在PHP中寻找从MySQL查询中获取多个表的策略,php,sql,mysql,Php,Sql,Mysql,我正在尝试从PHP页面中的查询构建一组结果。我的where子句很复杂,而且可能很昂贵。用我通常的语言,我会做一些类似的事情: CREATE TEMPORARY TABLE ShortList (ID INT); INSERT INTO ShortList SELECT ID FROM Table1 WHERE {Super long query}; SELECT * FROM Table1 JOIN ShortList ON ShortList.ID = Table1.ID; SELECT

我正在尝试从PHP页面中的查询构建一组结果。我的where子句很复杂,而且可能很昂贵。用我通常的语言,我会做一些类似的事情:

CREATE TEMPORARY TABLE ShortList (ID INT);
INSERT INTO ShortList
  SELECT ID FROM Table1 WHERE {Super long query};

SELECT * FROM Table1 JOIN ShortList ON ShortList.ID = Table1.ID;
SELECT * FROM Table2 JOIN ShortList ON ShortList.ID = Table2.Table1ID;
SELECT * FROM Table3 JOIN ShortList ON ShortList.ID = Table3.Table1ID;
SELECT * FROM Table4 JOIN ShortList ON ShortList.ID = Table4.Table1ID;
然后我将遍历每一个结果集并提取每一行。考虑到这些数据,跨所有的表进行连接不是很容易;这将导致大量重复数据


那么PHP实现这一点的方法是什么呢?

我建议您尝试编写一个SQL过程(存储过程)来实现这一点。过程用于处理复杂/多个查询

您正在使用什么RDBMS?大多数现代RDBMS都支持存储过程


以防万一,如果您使用的是MySQL->

我从未做过如此复杂的事情,但我建议您创建一个数据库访问类来处理查询。然后可以创建该类的多个对象以同时保存三个结果集。类似于

$big_query   = new database_access ();
$table1      = new database_access ();
$other_table = new database_access ();

$big_query->query ("large query string");

while ($row_array = $big_query->fetch ())
{
    $table1->query ("table 1 query string accessing ".$row_array[id]);

    while ($table1_row_array = $table1->fetch ())
    {
        $other_table->query ("other table query accessing ".$table1_row_array[table1ID]);

        while ($other_table_row_array = $other_table->fetch ())
        {
            // deal with results
        }

        // ...etc...

    }

}

我希望这就是你的想法,我没有去回答一个不同的问题。

我已经弄明白了。我习惯于一个事务模型,在这个模型中,我必须显式地将多个语句放入一个事务中。PHP/MySQL假定多个查询位于同一事务中。因此,最终的方法是对每个SQL语句运行一个查询:

mysql_query("CREATE TEMPORARY TABLE ShortList (ID INT)");
mysql_query("INSERT INTO ShortList SELECT ID FROM Table1 WHERE {Super long query}");

mysql_query("SELECT * FROM Table1 JOIN ShortList ON ShortList.ID = Table1.ID");
mysql_query("SELECT * FROM Table2 JOIN ShortList ON ShortList.ID = Table2.Table1ID");
mysql_query("SELECT * FROM Table3 JOIN ShortList ON ShortList.ID = Table3.Table1ID");
mysql_query("SELECT * FROM Table4 JOIN ShortList ON ShortList.ID = Table4.Table1ID");

希望这能帮助其他有同样问题的人。

好的,但这并不能解决如何获得多个结果集的问题。所以我将所有这些都移动到一个存储过程中。我仍然不想多次运行谓词。我考虑过这种方法,但它需要多次往返数据库。如果您的大查询字符串返回100000行,并且我有4个表要查询,那么我将在数据库上运行400000个独立查询。这是真的,但是由于主查询中的行数非常大,如果您这样说的话,它将有助于人们回答您的问题。说得好,以后我会尽量把我的问题弄清楚。我并不知道这些数字会有多大(它们的平均值可能在100左右),但我喜欢防止这些失控的条件mysql默认为autocommit,因此这四个选择实际上不在事务中,除非您显式地将autocommit设置为0;或者执行“开始”或“启动事务”。