Pregunta

Actualmente estoy usando el siguiente código 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();
    }

Básicamente me estoy haciendo una lista de usuarios que son subordinados de un supervisor_id determinado (cada entrada de usuario tiene un campo supervisor_id), y luego agarrar las entradas que pertenecen a cualquiera de esos usuarios.

No puedo evitar pensar que hay una manera más elegante de hacer esto, como SELECT FROM tablename where user->supervisor_id=2222

¿Hay algo como esto con PHP / MySQL?
probablemente debería aprender las bases de datos relacionales adecuadamente en algún momento. : (

Editar : aquí es el esquema correspondiente

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

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

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

submission uno tiene muchas submittedentries, y actualmente estoy haciendo referencia mediante el uso de la marca de tiempo. Yo estaría más que dispuesto a alterar esto si alguien puede sugerir una manera más eficiente. (Y sí, hay más campos que estoy omitiendo)

¿Fue útil?

Solución

Esto debería, si tengo la columna de nombres correcta, obtener una lista de las comunicaciones de los usuarios que tienen el supervisor especificado.

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

Esta versión intenta combinar la marca de tiempo de comprobar también.

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

Editar: Se ha actualizado para que coincida con la información Tabla adicional. Todavía no estoy 100% seguro de que la segunda versión es correcta, tendrá que ser probado contra la base de datos para averiguar:)

Ah, y en la práctica probablemente debería reemplazar el asterisco con los nombres de las columnas reales que desea recuperar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top