PHP / Mysql:从查找表中读取数据字段值(拆分数组)

时间:2010-09-11 06:49:38

标签: php mysql database

我有1个带有2个表的Mysql数据库:

文献  ...   - staffID  .....

职工  - ID   - 姓名

DOCUMENTS表将每个文档分配给STAFF表中的一个或多个用户,因此DOCUMENTS表中的staffID由逗号分隔的人员ID数组组成,例如(2,14)。

我设法将数组拆分为单独的值:

  • 2
  • 14

但是我没有拥有ID号码,而是希望从STAFF表中获得实际名称 - 我怎样才能实现这一目标。任何帮助将不胜感激 - 请参阅下面的我当前的代码。

$result = mysql_query("SELECT 
  organizations.orgName,
  documents.docName,
  documents.docEntry,
  documents.staffID,
  staff.Name,
  staff.ID
FROM
  documents
  INNER JOIN organizations ON (documents.IDorg = organizations.IDorg)
  INNER JOIN staff ON (documents.staffID = staff.ID)
")
or die(mysql_error());  


while($row = mysql_fetch_array($result)){
    $splitA = $row['staffID'];
    $resultName = explode(',', $splitA );
    $i=0;

    for($i=0;$i<count($resultName);$i++)
    {
        echo "<a href='staffview.php?ID=".$row['docName'].
            "'>". $resultName[$i]."</a><br>";
    }

    echo '<hr>';

}

2 个答案:

答案 0 :(得分:1)

看起来您的现有代码可能documents.staffID = staff.ID处工作 - 那就是只有一个与该文档关联的staffID?

最好添加一个表来对文档和人员之间的关系进行单独建模,并删除或弃用文档表中的staffID字段。你需要像

这样的东西
CREATE TABLE document_staff (
    document_id <type>,
    staff_id    <type>
)

如果您有大量数据和/或想要在两个方向上有效地遍历关系,则可以包含( document_id, staff_id )( staff_id, document_id )的复合索引。

(你没有提到你的身份字段的数据类型,但documents.staffID似乎是基于你所说的某种varchar - 也许你可以使用整数类型代替?)

您可以使用现有架构和MySQL FIND_IN_SET功能实现您想要的功能:

SELECT 
    organizations.orgName,
    documents.docName,
    documents.docEntry,
    documents.staffID,
    staff.Name,
    staff.ID
FROM
    documents
INNER JOIN organizations ON (documents.IDorg = organizations.IDorg)
INNER JOIN staff ON ( FIND_IN_SET( staff.ID, documents.staffID ) > 0 )

MySQL集类型有限制 - 例如,最大成员资格大小为64 - 但可能足以满足您的需求。

如果是我,我会改变模型,而不是使用FIND_IN_SET

答案 1 :(得分:0)

非常感谢你的回答 - 非常感谢! 我的表设置是:

文件:

CREATE TABLE documents (
  docID     int NOT NULL,
  docTitle  mediumblob NOT NULL,
  staffID   varchar(120) NOT NULL,
  Author2   int,
  IDorg     int,
  docName   varchar(150) NOT NULL,
  docEntry  int AUTO_INCREMENT NOT NULL,
  /* Keys */
  PRIMARY KEY (docEntry)
) ENGINE = MyISAM;

职工:

CREATE TABLE staff (
  ID            int AUTO_INCREMENT NOT NULL,
  Name          varchar(60) NOT NULL,
  Organization  varchar(20),
  documents     varchar(150),
  Photo         mediumblob,
  /* Keys */
  PRIMARY KEY (ID)
) ENGINE = MyISAM;

DOCUMENTS表通过STAFF表中的查找表(下拉列表)进行读取,以便我可以将多个工作人员分配给文档。所以我可以访问DOCUMENTS表中的staffID数组并拆分它,我想知道是否有办法将staffID与staff.Name相关联并打印出人员名称而不是查询结果中的ID。再次感谢!