0

我目前正在使用以下 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,目前我正在使用时间戳来引用它。如果有人可以提出更有效的方法,我非常愿意改变这一点。(是的,我省略了更多字段)

4

1 回答 1

2

如果我得到正确的列名,这应该会从具有指定主管的用户那里获得提交列表。

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% 确定第二个版本是正确的,需要针对数据库进行测试以找出:)

哦,在实践中,您可能应该将星号替换为您要检索的实际列的名称。

于 2010-03-17T03:34:52.993 回答