mysql - Create View query of 2 tables (with data from 3 tables) -


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