Relazionale MySQL - proprietà recuperati?
-
20-09-2019 - |
Domanda
Attualmente sto usando il seguente codice 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();
}
In sostanza sto ottenendo un elenco di utenti che sono subordinati di un dato supervisor_id (ogni voce utente ha un campo supervisor_id), poi afferrando le voci appartenenti a uno qualsiasi di questi utenti.
Non riesco a fare a meno di pensare che ci sia un modo più elegante per fare questo, come SELECT FROM tablename where user->supervisor_id=2222
C'è qualcosa di simile con PHP / MySQL?
Dovrebbe probabilmente imparare database relazionali correttamente qualche volta. : (
Modifica : qui è lo schema relativo
submissions
===============================
id, user_id, timestamp
submittedentries
===============================
id, user_id, timestamp
users
===============================
id, supervisor_id, email
una submission
ha molti submittedentries
, e attualmente sto riferimento a questo utilizzando il timestamp. Sarei più che disposto a modificare questo se qualcuno può suggerire un modo più efficiente. (E sì, ci sono più campi che sto omettendo)
Soluzione
Questo dovrebbe, se ho ottenuto la colonna nomi corretta, ottenere un elenco di osservazioni da parte degli utenti che hanno il supervisore specificato.
SELECT * FROM users, submissions
WHERE users.supervisor_id = $supervisorID
AND submissions.user_id = users.id
Questa versione tenta di combinare il timestamp controllo pure.
SELECT * FROM users, submissions, submittedentries
WHERE users.supervisor_id = $supervisorID
AND submissions.user_id = users.id
AND submittedentries.timestamp = submissions.timestamp
Modifica: aggiornato per abbinare le informazioni tabella aggiuntiva. Non sono ancora sicuro al 100% che la seconda versione è corretta, avrà bisogno di essere testati contro il database per scoprire:)
Oh, e in pratica probabilmente si dovrebbe sostituire l'asterisco con i nomi delle colonne effettive che si desidera recuperare.