如何在选择中嵌入选择或从选择中调用另一个函数?

时间:2013-05-09 14:56:29

标签: php mysql

我有一个像这样的选择语句:

    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

谢谢。

2 个答案:

答案 0 :(得分: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 :(得分:1)

您在MySQL服务器端处理的数据越多,MySQL服务器和PHP应用程序之间的流量就越少,从而加快了应用程序的运行速度。我会说要立即从服务器获取所有数据而不是来回多次。

如果你需要在其他应用程序中重用它,你也可以在MySQL中创建getLastCourseAccessByUser函数作为存储函数:

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