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

onesubmissionには manysubmittedentriesがあり、現在、タイムスタンプを使用してこれを参照しています。誰かがより効率的な方法を提案できるなら、私はこれを喜んで変更します。(そして、はい、省略しているフィールドが他にもあります)

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

編集:追加のテーブル情報と一致するように更新されました。2番目のバージョンが正しいかどうかはまだ100%確信が持てません.データベースに対してテストする必要があります:)

ああ、実際には、アスタリスクを取得したい実際の列の名前に置き換える必要があります。

于 2010-03-17T03:34:52.993 に答える