创建2个表的查看查询(包含3个表中的数据)

时间:2016-04-06 13:14:41

标签: mysql sql join view union

我想创建一个将2个表组合成视图的查询。但是为了获得所需的所有数据,我还必须查询第三个表(但是这个表不必出现在视图中)。它必须简单地执行以下操作(用普通英语编写):

edu_courses 获取所有记录(并记住_id字段)

THEN

edu_lessons 获取所有记录,其中 course_id 等于 edu_courses <中的 _id 字段/强>

THEN

edu_lessons_dates 获取所有记录,其中 lesson_id 等于 edu_lessons <中的 _id 字段/强>

THEN

使用最近的start_date搜索 edu_lessons_dates 中的记录(如果有两个相等的start_date字段,则必须找到最接近的start_time)< / p>

最终

将查询与单个输出(在视图或其他内容中)组合为:

'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

我已尝试过以下操作,但这根本不起作用:

select
courses._id,
courses.name,
courses.content, 
dates.start_date,
dates.end_date,
from
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 by dates.start_date DESC, dates.start_time DESC
LIMIT 1

我有3个表格,结构如下:

&#39; edu_courses&#39; - &GT;

_id
   name
   content
   yt_url
   image_url
   difficulty_level
   price
   online (bool)
   max_people

&#39; edu_lessons&#39; - &GT;

_id
   course_id
   name
   content
   sort

&#39; edu_lessons_dates&#39; - &GT;

_id
   lesson_id
   start_date
   start_time
   end_date
   end_time
   current_people

1 个答案:

答案 0 :(得分:1)

试试这个:

CREATE OR REPLACE VIEW edu_courses_vw AS
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
FROM 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 BY d.start_date DESC, d.start_time DESC

如果您只需要第一课的日期,则可以使用以下子查询:

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
FROM edu_courses c
JOIN (SELECT MIN(d.start_date + d.start_time) AS min_date_time, l.course_id
  FROM edu_lessons l
  JOIN edu_lessons_dates d
    ON d.lesson_id = l._id
  GROUP BY l.course_id) AS ld ON ld.course_id = c._id

但是只有start_time数字时间值(小于1)或者interval和start_date是date(datetime类型)才能正常工作。如果此字段具有其他类型,则必须在求和之前将其转换 编辑:
对于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)) AS min_date_time
FROM 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 BY c._id
, c.name
, c.content
, c.yt_url
, c.image_url
, c.difficulty_level
, c.price
, c.online
, c.max_people

您还可以从子查询创建视图,并像查询中的表一样使用它

CREATE OR REPLACE VIEW edu_courses_min_dt_vw AS
SELECT MIN(ADDTIME(d.start_date, d.start_time)) AS min_date_time, l.course_id
FROM edu_lessons l
JOIN edu_lessons_dates d
  ON d.lesson_id = l._id
GROUP BY 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
FROM edu_courses c
LEFT JOIN edu_courses_min_dt_vw AS ld ON ld.course_id = c._id