0

次のような select ステートメントがあります。

    SELECT c.id AS courseid, u.id AS userid

    FROM

    mdl_user_enrolments ue
    join mdl_enrol e on e.id = ue.enrolid
    join mdl_user u on u.id = ue.userid
    join mdl_course c on c.id = e.courseid

現在のテーブルと直接関係のない別のデータが必要です。私は出力ループでこの関数を呼び出してきましたが、

function getLastCourseAccessByUser($courseid, $userid){
global $DB;
return
    $DB->get_record_sql('
    SELECT FROM_UNIXTIME(time, "%m/%d/%Y") as ftime
    FROM mdl_log
    WHERE course = '.$courseid.' AND userid = '.$userid.'

    ORDER BY time DESC
    limit 1
');

}

ただし、すべてのデータを一度に取得し、db をコールバックしないでください。

私はこれを試しています:

            SELECT c.id AS courseid, u.id as userid

            (
               SELECT FROM_UNIXTIME(time, "%m/%d/%Y") as ftime
               FROM mdl_log
               WHERE course = c.id AND userid = u.id 
            )  AS lastaccessdate

        FROM

         mdl_user_enrolments ue
         join mdl_enrol e on e.id = ue.enrolid
         join mdl_user u on u.id = ue.userid
         join mdl_course c on c.id = e.courseid

または、次のようにSQLから直接関数を呼び出すことはできますか:

        SELECT c.id AS courseid, u.id as userid,

             '.getLastCourseAccessByUser(c.id,u.id).' AS lastaccessdate

    FROM

        mdl_user_enrolments ue
        join mdl_enrol e on e.id = ue.enrolid
        join mdl_user u on u.id = ue.userid
        join mdl_course c on c.id = e.courseid

ありがとうございました。

4

2 に答える 2

2
SELECT c.id AS courseid, u.id AS userid, FROM_UNIXTIME(t.time, "%m/%d/%Y") as ftime

    FROM

    mdl_user_enrolments ue
    join mdl_enrol e on e.id = ue.enrolid
    join mdl_user u on u.id = ue.userid
    join mdl_course c on c.id = e.courseid
    join mdl_log t on t.course = c.id and t.userid = u.id

AND 句と OR 句を mysql の結合に入れることができるため、両方の条件で結合できます。条件が満たされない場合にクエリ全体が失敗しないように、外部結合にしたい場合がありますが

それ以外の場合は、サブ選択オプションも機能するはずです(これ)

 SELECT c.id AS courseid, u.id as userid

            (
               SELECT FROM_UNIXTIME(time, "%m/%d/%Y") as ftime
               FROM mdl_log
               WHERE course = c.id AND userid = u.id 
            )  AS lastaccessdate

        FROM

         mdl_user_enrolments ue
         join mdl_enrol e on e.id = ue.enrolid
         join mdl_user u on u.id = ue.userid
         join mdl_course c on c.id = e.courseid
于 2013-05-09T15:00:10.150 に答える
1

MySQL サーバー側で処理するデータが多いほど、MySQL サーバーと PHP アプリケーションの間で生成されるトラフィックが少なくなるため、アプリケーションが高速化されます。サーバーからすべてのデータを一度に取得し、何度も行き来しないようにします。

getLastCourseAccessByUser他のアプリケーションで再利用する必要がある場合は、関数を MySQL のストアド関数として作成することもできます。

DELIMITER \\
DROP FUNCTION IF EXISTS getLastCourseAccessByUser\\
CREATE FUNCTION getLastCourseAccessByUser (in_course_id INT, in_user_id VARCHAR(50) 
RETURNS STRING
BEGIN
    SELECT FROM_UNIXTIME(time, "%m/%d/%Y") AS ftime
    FROM mdl_log
    WHERE course = in_course_id AND userid = in_user_id 
    ORDER BY time DESC
    LIMIT 1
END\\
DELIMITER ;

SELECT次に、ステートメントでそれを使用できます。

SELECT c.id AS courseid, 
       u.id as userid,
       getLastCourseAccessByUser(c.id,u.id) AS lastaccessdate
  FROM mdl_user_enrolments ue
  JOIN mdl_enrol e on e.id = ue.enrolid
  JOIN mdl_user u on u.id = ue.userid
  JOIN mdl_course c on c.id = e.courseid
于 2013-05-09T15:01:43.377 に答える