2013-05-09 109 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 
相关问题