2013-10-11 48 views
3

我有三个表的执行第一查询动态表名,第一个是存储应用程序的表,第二个是存储不同的在线的形式(不同类型的应用程序)的表,第三个是存储实际形式的数据的表:PHP + MySQL的:从第二查询

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) 
    =============================== 

在 “form_businessLicense” 或 “eventLicense” “formRecordID” 指向 “的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语句中使用。

+0

多少不同'form_ *'表有哪些? – SpaceDog

+0

为什么使用for循环而不是简单的while/foreach。那么你首先得到一个表名和id列表,然后你做一个内连接并且一次获得所有的数据! – botenvouwer

+1

将所有这些动态命名的表合并到一个通用表中通常是一个很好的设计决策。你可以过滤和搜索更容易,不会有任何这样的问题。这种动态生成的表名,可能具有相同的结构,通常不是一个好的设计决策。 – ToBe

回答

0

您需要申请加入三个表,三表的SELECT COUNT(PK),而第三个表的PK加一个group by子句。

注: PK用于主键