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)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top