Реляционные свойства, извлекаемые из MySQL?
-
20-09-2019 - |
Вопрос
В настоящее время я использую следующий 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?
Вероятно, когда-нибудь мне следует должным образом изучить реляционные базы данных.:(
Редактировать:вот соответствующая схема
submissions
===============================
id, user_id, timestamp
submittedentries
===============================
id, user_id, timestamp
users
===============================
id, supervisor_id, email
один submission
имеет много submittedentries
, и в настоящее время я ссылаюсь на это, используя временную метку.Я был бы более чем готов изменить это, если кто-нибудь сможет предложить более эффективный способ.(и да, есть еще поля, которые я опускаю)
Решение
Это должно, если я правильно ввел имена столбцов, получить список отправок от пользователей, у которых есть указанный супервизор.
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%, что вторая версия верна, нужно будет протестировать ее с базой данных, чтобы выяснить :)
О, и на практике вам, вероятно, следует заменить звездочку названиями фактических столбцов, которые вы хотите получить.