PHP / Mysql: чтение значения поля данных из справочных таблиц (разделенный массив) - PullRequest
2 голосов
/ 11 сентября 2010

У меня есть 1 база данных Mysql с 2 таблицами:

ДОКУМЕНТЫ ... - staffID .....

ПЕРСОНАЛ - Я БЫ - Имя

Таблица DOCUMENTS присваивает каждый документ одному или нескольким пользователям из таблицы STAFF, поэтому staffID в таблице DOCUMENTS состоит из массива идентификаторов персонала, разделенных запятыми, например (2, 14).

Мне удалось разбить массив на отдельные значения:

  • 2
  • 14

но вместо того, чтобы иметь идентификационные номера, я хотел бы иметь фактические имена из таблицы 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 ]

1 голос
/ 11 сентября 2010

Похоже, ваш существующий код может работать там, где documents.staffID = staff.ID - где с документом связан только один идентификатор персонала?

Было бы лучше добавить таблицу для моделирования отношений между документами и персоналом отдельно от любого из них, а также удалить или исключить поле 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.

0 голосов
/ 12 сентября 2010

Большое вам спасибо за ответ - с благодарностью! Моя таблица настроек:

ДОКУМЕНТЫ:

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, чтобы я мог назначить несколько сотрудников для документа. Таким образом, я могу получить доступ к массиву staffID в таблице DOCUMENTS и разделить его, и мне интересно, есть ли способ связать staffID с staff.Name и распечатать имя персонала, а не ID в результатах запроса. Еще раз спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...