2

假设我有这个查询:

<?
     $qi = $db->prepare('SELECT one.id, one.Value, two.Name, three.nfid, temp.Name AS Alias
           FROM one
           INNER JOIN two ON one.fid = two.id
           LEFT OUTER JOIN three ON two.fid = three.fid
           LEFT OUTER JOIN (SELECT id,Name FROM two) AS temp ON three.nfid = temp.id
           WHERE one.rid = ?
           ORDER BY one.id ASC');
      $qi->execute( array( $id ) );
?>

表之间的连接是:

包含许多行,one.Value其中包含one.rid和字段one.fid

fid是与表2的连接,其中包含two.Name项目 ( one.fid= two.id)。

但有时该项目是另一个项目的别名,这就是表3存在的原因。它包含字段three.fidthree.newfidwhere three.newfid= two.id(但对于另一个带有另一个的项目two.Name

该查询应该从一个具有特定one.rid和 get的行中获取所有行one.Valuetwo.Name如果有一个three.fidfor this one.fid,则 get two.Namefor three.newfid并将其命名为 Alias。

有没有办法改进这个查询或以另一种方式解决问题?也许重塑数据库的布局?目前速度很慢。此处的示例已被简化以使其更通用。

谢谢你。

4

1 回答 1

1

括号中的子查询强制 MYSQL 忽略它的索引,这使得它需要很长时间。最好直接加入两个作为临时工。只要你总是把两个.[field] 和 temp.[field] 放在一起,它就能很好地把它们区分开来。

  SELECT one.id, one.Value, two.Name, three.nfid, temp.Name AS Alias
  FROM one
  INNER JOIN two ON one.fid = two.id
  LEFT OUTER JOIN three ON two.fid = three.fid
  LEFT OUTER JOIN two AS temp ON three.nfid = temp.id
  WHERE one.rid = ?
  ORDER BY one.id ASC
于 2013-10-10T00:33:59.737 回答