2013-05-09 114 views
0

我有一個select語句是這樣的:如何在select中嵌入select或從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 
'); 

}

,但更希望得到的所有數據一次,而不是回調分貝。直接從像這樣的SQL

  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 

或者,我可以調用函數:

我想這

 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 

謝謝。

回答

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 
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 
相關問題