Php 如何将select嵌入select或从select调用另一个函数?
我有这样一个select语句:Php 如何将select嵌入select或从select调用另一个函数?,php,mysql,Php,Mysql,我有这样一个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 SELECT c.id AS cou
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
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
我还需要另一段数据,它与当前表没有直接关系。我一直在输出循环中调用这个函数
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
');
}
但我宁愿一次获取所有数据,也不回叫数据库
我正在尝试:
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
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
多谢各位
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
您可以在mysql中的联接中放置AND和OR子句,以便可以在两个条件上联接。尽管您可能希望将其设置为外部联接,以便在不满足条件时不会使整个查询失败
否则,您的子选择选项也应起作用(此选项)
您可以在mysql中的联接中放置AND和OR子句,以便可以在两个条件上联接。尽管您可能希望将其设置为外部联接,以便在不满足条件时不会使整个查询失败
否则,您的子选择选项也应起作用(此选项)
在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
在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