2010-09-11 3 views
2

I have 1 base de données Mysql avec 2 tables:PHP/Mysql: lire la valeur du champ de données à partir des tables de consultation (array split)

DOCUMENTS ... - StaffID .....

PERSONNEL - ID - Nom

les documents tableau attribue chaque document à un utilisateur unique ou multiple de la table sTAFF donc la StaffID dans la table dOCUMENTS se compose d'un tableau séparées par des virgules du personnel ID de par exemple (2, 14).

j'ai réussi à diviser le tableau en valeurs individuelles:

mais plutôt que d'avoir les numéros d'identification que je voudrais avoir les noms réels de la table STAFF - Comment puis-je atteindre cet objectif. Toute aide serait grandement appréciée - s'il vous plaît voir mon code actuel ci-dessous.

$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>'; 

} 
+0

J'ai mis à jour ma réponse pour montrer la requête complète que j'avais en tête. Si vous n'avez pas besoin de l'identification du personnel, vous pouvez simplement l'omettre. Y a-t-il une importance pour l'organisation dans la sélection des dossiers de la table du personnel? –

+0

btw - probablement préférable de modifier l'information supplémentaire dans votre question originale, plutôt que de poster une mise à jour comme réponse! –

Répondre

1

Il ressemble à votre code pourrait travail où documents.staffID = staff.ID existant - c'est là il y a juste un StaffID unique associé au document? Il vaudrait mieux ajouter une table pour modéliser séparément les relations entre les documents et le personnel et supprimer ou déprécier le champ staffID dans la table des documents. Vous auriez besoin de quelque chose comme

CREATE TABLE document_staff (
    document_id <type>, 
    staff_id <type> 
) 

Vous pouvez inclure les index composés avec (document_id, staff_id) et (staff_id, document_id) si vous avez beaucoup de données et/ou si vous voulez traverser la relation efficacement dans les deux sens.

(Vous ne mentionnez pas les types de données pour vos champs d'identité, mais documents.staffID semble être une sorte de varchar en fonction de ce que vous dites - vous pourriez peut-être utiliser un type entier pour ces place)

Mais vous pouvez probablement obtenir ce que vous voulez en utilisant le schéma existant et la fonction 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 définir les types ont des limites - taille maximale d'affiliation de 64 par exemple - mais peut-être suffisant pour vos besoins.

Si c'était moi cependant, je changerais le modèle plutôt que d'utiliser FIND_IN_SET.

0

Merci beaucoup pour votre réponse - très appréciée!Configuration Ma table est:

DOCUMENTS:

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; 

PERSONNEL:

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; 

Le tableau DOCUMENTS lit via une table de recherche (déroulant) de la table STAFF afin que je puisse affecter plusieurs employés membres d'un document. Je peux donc accéder au tableau staffID dans la table DOCUMENTS et le diviser et je me demande s'il y a un moyen d'associer le staffID au staff.Name et d'imprimer le nom du staff plutôt que l'ID dans les résultats de la requête. Merci encore!

Questions connexes