0

我使用 MySQL & PHP 并有以下数据库请求:

$result1 = mysql_query("SELECT nummer FROM abo WHERE usr = '{$usr}'");

while($row = mysql_fetch_object($result1))
{
  $sendung=$row->sendung;
  $result2 = mysql_query("SELECT *
                            FROM filme 
                           WHERE sendung = '{$sendung}' 
                        ORDER BY datum DESC LIMIT 0,1;");

  while($row = mysql_fetch_object($result2))
  {
    [...]
  }
}

例如,第二个 while 被调用 20 次 -> 有 20 个数据库请求。但是我可以连接这个请求或优化这个请求吗?

一种方法:

$arraysendung = array();

$result1 = mysql_query("SELECT nummer FROM abo WHERE usr = '{$usr}'");

while($row = mysql_fetch_object($result1))
{
  array_push($arraysendung,$row->sendung);
}

但是我怎么能$arraysendung在一个请求中使用(有可能)?

4

2 回答 2

2

使用JOIN

SELECT nummer, filme.*
FROM abo
JOIN filme ON filme.sendung = abo.nummer
ORDER BY datum desc

这不是 100% 的替代品,因为 LIMIT 的东西没有到位,但应该足以让你开始。

在大多数情况下,只要您运行两个以上的查询,并且后面的查询基于早期查询的结果,您几乎总是可以将它们重写为单个 JOINed 查询。

于 2013-02-15T15:06:48.663 回答
1

查询:

SELECT filme.*
FROM filme JOIN 
    (SELECT sendung, max(datum) as datum FROM filme GROUP BY sendung) as md 
    ON filme.sendung = md.sendung AND md.datum = filme.datum
WHERE filme.sendung IN (SELECT nummer FROM abo WHERE  usr = '{$usr}')

应该产生类似的结果,包括“LIMIT 1 部分”,前提是“sendung,datum”是唯一的。

请参阅:子查询和 JOIN

于 2013-02-15T15:25:43.853 回答