首先,我无法控制数据库结构等。
我需要使用PHP按状态和名称检索记录,但所有数据都在多个表中。基本上我需要尝试理解如何将这两个查询组合起来,以便它们不会运行得那么慢。
首先我用PHP获取记录ID。 (让我们假设$ query返回一个ID数组)
table_products =一堆产品
$query = "SELECT id,name FROM table_products WHERE name = '".$name."';";
我需要遍历这些记录(注意:可能有很多)并找出这些ID位于另外两个表中的位置,这两个表具有它们可能位于的位置信息。
table_places =包含一堆位置的表
link_table =包含产品和位置之间的关系
$state = "somestate";
foreach($query as $row)
{
$query_two = "SELECT table_places.name, table_places.id, table_places.state, link_table.place_id, link_table.product_id
FROM table_places
INNER JOIN link_table
ON table_places.id = link_table.place_id
WHERE table_places.state = '".$state."' AND link_table.product_id = '".$row->id."';";
}
上帝,我希望这是有道理的。我不是查询大师,所以如果我能帮助优化它以便更快地运行,我将不胜感激。
答案 0 :(得分:4)
痛苦在这里:
foreach($query as $row) <<--- you are pinging the DB to death.
合并两个查询:
SELECT
pl.name, pl.id, pl.state,
l.place_id, l.product_id,
pr.name
FROM table_places pl
INNER JOIN link_table l ON (pl.id = l.place_id)
INNER JOIN table_products pr ON (l.product_id = pr.id)
WHERE pr.name = '$name'
AND pl.state = '$state'
ORDER BY pr.name, pl.state
确保在ON
子句和where
子句中使用的所有字段上放置索引。
答案 1 :(得分:0)
您可以在一个查询中加入两个以上的表。未经测试的查询类似于;
SELECT * FROM table_products AS prod LEFT JOIN (link_table AS link, table_places AS places)
ON (prod.id=link.id AND prod.id=places.id)
WHERE some_field='some_value'
这肯定会带来一些性能提升,因为一个查询大多数时候比记录数查询快得多(因为你现在遍历记录并查询db一次记录)
答案 2 :(得分:-2)
答案很简单:无法控制数据库结构 - 无法优化 由于索引是查询优化的基石,您显然需要访问表结构才能添加一个。