Реляционные свойства MySQL - извлечены? - PullRequest
0 голосов
/ 17 марта 2010

В настоящее время я использую следующий код PHP:

    // Get all subordinates
    $subords = array();
    $supervisorID = $this->session->userdata('supervisor_id');
    $result = $this->db->query(sprintf("SELECT * FROM users WHERE supervisor_id=%d AND id!=%d",$supervisorID, $supervisorID));
    $user_list_query = 'user_id='.$supervisorID;
    foreach($result->result() as $user){
        $user_list_query .= ' OR user_id='.$user->id;
        $subords[$user->id] = $user;
    }

    // Get Submissions
    $submissionsResult = $this->db->query(sprintf("SELECT * FROM submissions WHERE %s", $user_list_query));
    $submissions = array();
    foreach($submissionsResult->result() as $submission){
        $entriesResult = $this->db->query(sprintf("SELECT * FROM submittedentries WHERE timestamp=%d", $submission->timestamp));
        $entries = array();
        foreach($entriesResult->result() as $entries)   $entries[] = $entry;
        $submissions[] = array(
            'user' => $subords[$submission->user_id],
            'entries' => $entries
        );
        $entriesResult->free_result();
    }

Обычно я получаю список пользователей, которые являются подчиненными данного supervisor_id (каждая запись пользователя имеет поле supervisor_id), а затем собираю записи, принадлежащие любому из этих пользователей.

Я не могу не думать, что есть более элегантный способ сделать это, например SELECT FROM tablename where user->supervisor_id=2222

Есть ли что-то подобное с PHP / MySQL?
Вероятно, стоит когда-нибудь правильно изучить реляционные базы данных. (

EDIT : вот соответствующая схема

submissions
===============================
id, user_id, timestamp

submittedentries
===============================
id, user_id, timestamp

users
===============================
id, supervisor_id, email

one submission имеет много submittedentries, и в настоящее время я ссылаюсь на это, используя отметку времени. Я был бы более чем готов изменить это, если бы кто-то мог предложить более эффективный способ. (и да, я пропускаю больше полей)

1 Ответ

2 голосов
/ 17 марта 2010

Это должно, если я правильно назвал столбцы, получить список представлений от пользователей, у которых есть указанный супервизор.

SELECT * FROM users, submissions
WHERE users.supervisor_id = $supervisorID
AND submissions.user_id = users.id

Эта версия также пытается объединить проверку отметки времени.

SELECT * FROM users, submissions, submittedentries
WHERE users.supervisor_id = $supervisorID
AND submissions.user_id = users.id
AND submittedentries.timestamp = submissions.timestamp

Редактировать: Обновлено, чтобы соответствовать дополнительной информации таблицы.Я все еще не уверен на 100%, что вторая версия верна, нужно будет проверить ее по базе данных, чтобы выяснить:)

О, и на практике вам, вероятно, следует заменить звездочку именамифактические столбцы, которые вы хотите получить.

...