在PHP中寻找从MySQL查询中获取多个表的策略
我正在尝试从PHP页面中的查询构建一组结果。我的where子句很复杂,而且可能很昂贵。用我通常的语言,我会做一些类似的事情:在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
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;或者执行“开始”或“启动事务”。