假设我有这个查询:
<?
$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
是与表二的连接,表二包含项目的two.Name
(one.fid
= two.id
(。
但有时该项目是另一个项目的别名,这就是表 3 存在的原因。它包含字段three.fid
和three.newfid
其中three.newfid
= two.id
(但对于具有另一个two.Name
的项目(
该查询应该从具有特定one.rid
的行中获取所有行并获取one.Value
,two.Name
如果此one.fid
有three.fid
,则获取three.newfid
的two.Name
并将其称为别名。
有没有办法改进此查询或以其他方式解决问题?也许重塑数据库的布局?目前速度很慢。此处的示例已简化,使其更通用。
谢谢。
括号中的子查询强制 MYSQL 忽略其索引,这使得它需要很长时间。 最好直接加入两个作为临时工。 只要你总是放两个。[场]和温度[场],它会很好地区分它们。
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