i want make query combines 2 tables view. of data required, have query third table (but table not have appear in view). has following (written in normal english):
get all records edu_courses (and remember _id field)
then
get all records edu_lessons course_id equal _id fields edu_courses
then
get all records edu_lessons_dates lesson_id equal _id field edu_lessons
then
search record in edu_lessons_dates closest start_date
(if there 2 equal start_date
fields has find closest start_time
)
eventually
combine query single output (in view or something) as:
'edu_courses_vw' -> edu_courses._id edu_courses.name edu_courses.content edu_courses.yt_url edu_courses.image_url edu_courses.difficulty_level edu_courses.price edu_courses.online (bool) edu_courses.max_people edu_lessons_dates.start_date edu_lessons_dates.start_time
i've tried following, not work @ all:
select courses._id, courses.name, courses.content, dates.start_date, dates.end_date, edu_courses courses join edu_lessons les on courses._id=les.course_id join edu_lessons_dates dates on les._id=dates.lesson_id order dates.start_date desc, dates.start_time desc limit 1
i have 3 tables following structure:
'edu_courses' ->
_id name content yt_url image_url difficulty_level price online (bool) max_people
'edu_lessons' ->
_id course_id name content sort
'edu_lessons_dates' ->
_id lesson_id start_date start_time end_date end_time current_people
try this:
create or replace view edu_courses_vw select c._id , c.name , c.content , c.yt_url , c.image_url , c.difficulty_level , c.price , c.online , c.max_people , d.start_date edu_courses c join edu_lessons l on l.course_id = c._id join edu_lessons_dates d on d.lesson_id = l._id order d.start_date desc, d.start_time desc
if need date of first lesson, can use subquery this:
select c._id , c.name , c.content , c.yt_url , c.image_url , c.difficulty_level , c.price , c.online , c.max_people , min_date_time edu_courses c join (select min(d.start_date + d.start_time) min_date_time, l.course_id edu_lessons l join edu_lessons_dates d on d.lesson_id = l._id group l.course_id) ld on ld.course_id = c._id
but work correctly if start_time numeric time value (lesser 1) or interval , start_date date (datetime type). if fields have other types must convert before sum.
edit:
mysql:
select c._id , c.name , c.content , c.yt_url , c.image_url , c.difficulty_level , c.price , c.online , c.max_people , min(addtime(d.start_date, d.start_time)) min_date_time edu_courses c join edu_lessons l on l.course_id = c._id join edu_lessons_dates d on d.lesson_id = l._id group c._id , c.name , c.content , c.yt_url , c.image_url , c.difficulty_level , c.price , c.online , c.max_people
you can create view subquery, , use table in query
create or replace view edu_courses_min_dt_vw select min(addtime(d.start_date, d.start_time)) min_date_time, l.course_id edu_lessons l join edu_lessons_dates d on d.lesson_id = l._id group l.course_id; select c._id , c.name , c.content , c.yt_url , c.image_url , c.difficulty_level , c.price , c.online , c.max_people , min_date_time edu_courses c left join edu_courses_min_dt_vw ld on ld.course_id = c._id
Comments
Post a Comment