PHP + Mysql:来自第一个查询的动态表名,用于执行第二个查询
Posted
技术标签:
【中文标题】PHP + Mysql:来自第一个查询的动态表名,用于执行第二个查询【英文标题】:PHP + Mysql: dynamic table name from first query for execution of second query 【发布时间】:2013-10-19 00:46:53 【问题描述】:我有三个表,第一个是存储应用程序的表,第二个是存储不同在线表单(不同类型的应用程序)的表,第三个是存储实际表单数据的表:
TABLE applications=========
-applicationID (PK)
-formID (FK)
-formRecordID
====================
TABLE forms=========
-formID (PK)
-formName
-tableName (could be 'form_businessLicense','eventLicense',etc)
====================
TABLE form_businessLicense=====
-recordID (PK)
-dateSubmitted
-(a whole bunch of other data)
===============================
“formRecordID”指向“form_businessLicense”或“eventLicense”中的“recordID”。由于它可以引用任何表,因此它不能是外键。因此,我从“forms”表中获取 tableName,然后构建一个查询以获取所有应用程序数据,例如“form_businessLicense”。
所以我需要从所有应用程序中获取数据,并从填写的申请表中获取一些数据(例如:form_businessLicense)。我只是要粘贴我的代码(我实际上是在查询一组给定 ID 中的所有应用程序):
$applications = $this->selectAll(
"SELECT applicationID, formName, tableName, fieldIdentifier, formRecordID, dateSubmitted, DATE_FORMAT(dateSubmitted,'%c/%e/%Y') AS dateSubmittedFormat
FROM applications AS a
JOIN forms AS f
ON a.formID = f.formID
WHERE a.applicationID IN (".$applicationIDs.")
ORDER BY dateSubmitted ASC"
);
for($a=0;$a<count($applications);$a++)
$form = $this->select("SELECT ".$applications[$a]['fieldIdentifier']." AS identifierName
FROM ".$applications[$a]['tableName']."
WHERE recordID = ".$applications[$a]['formRecordID']
);
$applications[$a]['identifierName'] = $form['identifierName'];
有没有办法将这两个查询合并为一个,这样我就不必遍历所有结果并为每个结果运行单独的查询?我觉得我可以通过 JOIN 来做到这一点,但我不确定如何引用“tableName”和“formRecordID”以在同一 SQL 语句中使用。
【问题讨论】:
有多少个不同的form_*
表?
你为什么使用for循环而不是简单的while/foreach。你先得到一个表名和 id 的列表然后你做一个内部连接并一次获取所有数据呢!
将所有这些动态命名的表合并到一个通用表中通常是一个很好的设计决策。然后,您可以更轻松地过滤和搜索,并且不会有任何此类问题。这种动态生成的表名,可能具有相同的结构,通常不是一个好的设计决策。
如果您的表都有不同的列(可能包含不同的表单数据),您可能需要切换到 EAV 模型。 en.wikipedia.org/wiki/… 我在 mysql 中运行它,它运行良好。
总共有 5 张桌子 - 每一张都非常非常不同。EAV 是一个很好的建议 - 如果表格是动态的,我可能会采用这种方法 - 但由于预算(和客户是 IT 部门——如果需要,可以直接处理数据库)我们认为采用这种方法会更快。 @sirwilliam,你有我的内部连接示例吗?
【参考方案1】:
您需要对三个表应用join,并选择第三个表的count(PK),同时为第三个表的PK添加group by子句。
注意: PK 用于主键
【讨论】:
以上是关于PHP + Mysql:来自第一个查询的动态表名,用于执行第二个查询的主要内容,如果未能解决你的问题,请参考以下文章