基于列值的MySQL内部联接表
假设我有一个具有以下结构的表“stats”:基于列值的MySQL内部联接表,mysql,sql,Mysql,Sql,假设我有一个具有以下结构的表“stats”: tableName | id |页面浏览量 tableName列对应于数据库中的各个表 在对“stats”运行查询时,对tableName列结果进行内部联接以获取每个表的数据的最佳方法是什么我在考虑在foreach中运行动态选择,然后合并结果。例如: foreach($tableNames as $tableName) { $sql = "SELECT * FROM stats s
tableName | id |页面浏览量
tableName列对应于数据库中的各个表 在对“stats”运行查询时,对
tableName
列结果进行内部联接以获取每个表的数据的最佳方法是什么我在考虑在foreach中运行动态选择,然后合并结果。例如:
foreach($tableNames as $tableName) {
$sql = "SELECT *
FROM stats s
INNER JOIN $tableName tbl ON s.id = tbl.id
WHERE tableName = '$tableName'";
}
您是否有权先加入所有表,然后再处理它
SELECT *
FROM stats s
LEFT OUTER JOIN tbl1 ON s.id = tbl.id
LEFT OUTER JOIN tbl2 ON s.id = tbl2.id
然后在程序中获取所需的值
SELECT *
FROM stats s
LEFT OUTER JOIN tbl1 ON s.id = tbl.id
LEFT OUTER JOIN tbl2 ON s.id = tbl2.id
您应该尽量减少对数据库的查询数量,如果可能的话,尝试一次性完成
否则,请考虑存储过程等
这是一种简单的方法(有间接费用),我相信其他人也会帮助您。要获得所有表的统计信息,您可以使用一个UNION,具有2个或多个选择,每个表一个:
( SELECT s.*
, table1.title AS name --or whatever field you want to show
FROM stats s
JOIN $tableName1 table1
ON s.id = table1.id
WHERE tableName = '$tableName1'
)
UNION ALL
( SELECT s.*
, table2.name AS name --or whatever field you want to show
FROM stats s
JOIN $tableName2 table2
ON s.id = table2.id
WHERE tableName = '$tableName2'
)
UNION ALL
( SELECT s.*
, table3.lastname AS name --or whatever field you want to show
FROM stats s
JOIN $tableName3 table3
ON s.id = table3.id
WHERE tableName = '$tableName3'
)
;
将Winfred的想法用于
左连接
s。它会产生不同的结果,例如,来自其他表的每个字段都在其自己的列中输出(并且会出现许多空值)
谢谢你的建议。我将接受你的建议,使用左外连接。因此,您可以说,使用n个联接的查询比不使用存储过程的多个查询更有效?这取决于您提取的数据量。如果您要添加一个额外的列,而n相对较小,则这是一个可接受的解决方案。否则,您可以考虑如何用一个查询返回所有n行,它们在内部处理n行,或者在表不适合您的情况下使用SPs和更高级的数据结构。我认为此查询不会显示正确的结果。例如,它将关联来自tbl1的id=1的行和来自tbl2的id=1的行。您好。是的,我也有同样的问题。然而,我能够使用Union获得我想要的东西。您说“tableName列对应于数据库中的单独表”。“id”对应什么?我是否正确理解此统计表包含关于每个表的每一行的统计信息?所以统计数据中的每一行都在表“tableName”中存储“id”的“pageViews”?您好。谢谢你的回复。事实上,在你回答之前,我最终选择了这种方法,但再次感谢你的安慰。Thnx。实际上,有一种方法符合Winfred的想法,使用左连接,它将产生稍微不同的结果。