0

データベースからstudentid番号を選択するクエリからのデータが入力されたテーブルがあります。ビューはそのようなものです:

写真

ご覧のとおり、同じデータが複数回出力されています。私には、何らかの理由でカウンセラーが学生を終えることができず、その学生を別のカウンセラーに送ることができるという特徴があります。今、履歴データを維持するために、私はそのすべてのデータを保持しています。学生の質問に戻ると、現在のすべてのデータ(必要なもの)と過去のすべてのデータ(不要なもの)が表示されます。

これは私のsqlステートメントです:

    try 
                {
            $query = $dbh->prepare("SELECT 
        session.session_id AS id, 
        session.anum, 
        student.first, 
        student.last, 
        session.why, 
        session.studentcomments, 
        session.aidyear,
        support.counselorcomments 
        FROM 
        student INNER JOIN session ON student.anum = session.anum 
        INNER JOIN session_status ON session.status = session_status.status 
        LEFT JOIN support ON session.session_id = support.session_id
        WHERE session.status = 0 OR session.status = 2");

    $query->execute();
            $result = $query->fetchall();
                }
                    catch (PDOException $e) {
                    error_log($e->getMessage());
                    die($e->getMessage());
}

これで、データベースをセットアップする方法は、データベースが機能するように維持したい方法です。データをクエリする方法が問題だと思います。

これはmysqlのデータの写真です:

ここに画像の説明を入力してください

編集

この問題が修正されたので、挿入が発生するたびに(support.starttimeタイムスタンプを更新すると)上記のレコードが消えるというエラーが発生します。これは更新されたSQLです。

$query = $dbh->prepare("SELECT session.session_id AS id, session.anum, student.first, student.last, session.why, 
                        session.studentcomments, session.aidyear, support.counselorcomments FROM student LEFT JOIN 
                        session ON student.anum = session.anum LEFT JOIN session_status ON 
                        session.status = session_status.status LEFT JOIN support ON session.session_id = support.session_id
                        WHERE (session.status) IN (0) OR (session.status) IN (2) 
                        AND support.starttime = (SELECT MAX(support.starttime) FROM support INNER JOIN session ON session.session_id = 
                        support.session_id)");
4

2 に答える 2

1

私があなたの質問を正しく読んでいるなら、あなたはセッションテーブルからの最新の行だけが欲しいですよね?

その場合は、Where句に副選択を実装して、MAX(session.starttime)を取得する必要があります。

この場合、次の構文を使用できます。

WHERE ...(what you already have)...
  AND session.startime = (SELECT MAX({YourTable}.starttime)
                            FROM {YourTable}
                           WHERE {YourTable}.anum = session.anum)

関連するすべてのテーブルの詳細がわかれば、クエリ全体を作成します。これはあなたの質問に答えますか?

回答を更新:

サブクエリに開始時刻を指定するsession_idを指定する必要があります。これを行うには、サブクエリテーブルをメインクエリの結果セットに結合します。

サブクエリは次のようになります。

(SELECT MAX(a.starttime)FROM support WHERE a.session_id = session.session_id)

于 2013-01-27T19:13:22.773 に答える
0
SELECT DISTINCT 
    session.session_id as id,
    session.anum,
    student.first,
    student.last,
    session.why,
    session.studentcomments,
    session.aidyear,
    support.counselorcomments
FROM student
        INNER JOIN session 
            ON student.anum = session.anum
        LEFT JOIN support 
            ON session.session_id = support.session_id
        WHERE session.status IN (0,2)

ALbertoが私にそうするように言ったようにDISTINCTを使用しました!ありがとうアルベルト

于 2013-02-02T00:12:48.003 に答える