Question

Je suis actuellement en utilisant le code PHP suivant:

    // 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();
    }

En fait, je reçois une liste d'utilisateurs qui sont subordonnés d'un supervisor_id donné (chaque entrée utilisateur dispose d'un champ supervisor_id), saisissant alors les entrées appartenant à l'un de ces utilisateurs.

Je ne peux que penser qu'il ya une façon plus élégante de le faire, comme SELECT FROM tablename where user->supervisor_id=2222

Y at-il quelque chose comme ça avec PHP / MySQL?
Devrait probablement apprendre les bases de données relationnelles correctement quelque temps. : (

EDIT : voici le schéma correspondant

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

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

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

un submission a beaucoup submittedentries, et actuellement je fais référence cela en utilisant l'horodatage. Je serais plus que disposé à modifier ce si quelqu'un peut suggérer une façon plus efficace. (Et oui, il y a plus de domaines que j'omis)

Était-ce utile?

La solution

Cela devrait, si je suis les noms bonne colonne, obtenir une liste des soumissions des utilisateurs qui ont le superviseur spécifié.

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

Cette version tente de combiner l'horodatage et la vérification.

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

Edit: Mise à jour pour correspondre à la table d'information supplémentaire. Je ne suis toujours pas sûr à 100% que la deuxième version est correcte, devra être testé contre la base de données pour savoir:)

Oh, et en pratique, vous devez probablement remplacer l'astérisque avec les noms des colonnes réelles que vous souhaitez récupérer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top