Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 创建2个表的视图查询(使用3个表中的数据)_Mysql_Sql_Join_View_Union - Fatal编程技术网

Mysql 创建2个表的视图查询(使用3个表中的数据)

Mysql 创建2个表的视图查询(使用3个表中的数据),mysql,sql,join,view,union,Mysql,Sql,Join,View,Union,我想创建一个将两个表合并到一个视图中的查询。但要获得所需的所有数据,我还必须查询第三个表,但该表不必出现在视图中。它必须简单地用普通英语书写以下内容: 从edu_课程中获取所有记录并记住_id字段 然后 从edu_课程中获取所有记录,其中课程id等于edu_课程中的_id字段 然后 从edu_lessons_日期获取所有记录,其中lesson_id等于edu_lessons的_id字段 然后 在教育课程日期中搜索具有最接近开始日期的记录如果有两个相等的开始日期字段,则必须查找最接近的开始日期 最

我想创建一个将两个表合并到一个视图中的查询。但要获得所需的所有数据,我还必须查询第三个表,但该表不必出现在视图中。它必须简单地用普通英语书写以下内容:

从edu_课程中获取所有记录并记住_id字段

然后

从edu_课程中获取所有记录,其中课程id等于edu_课程中的_id字段

然后

从edu_lessons_日期获取所有记录,其中lesson_id等于edu_lessons的_id字段

然后

在教育课程日期中搜索具有最接近开始日期的记录如果有两个相等的开始日期字段,则必须查找最接近的开始日期

最终

将查询组合到视图或某物中的单个输出,如下所示:

'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个表,结构如下:

“教育大学课程”->

_id
   name
   content
   yt_url
   image_url
   difficulty_level
   price
   online (bool)
   max_people
“教育课程”->

_id
   course_id
   name
   content
   sort
“教育课程日期”->

_id
   lesson_id
   start_date
   start_time
   end_date
   end_time
   current_people
试试这个:

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
但只有当“开始时间”的时间数值小于1或“时间间隔”和“开始日期”为日期-日期-时间类型时,它才能正常工作。如果此字段有其他类型,则必须在求和之前对其进行转换。 编辑: 对于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

除了语法错误额外的逗号外,您的查询有什么问题?我在结果中看不到结束日期或结束时间。即使我在查询中选择dates.start_date和dates.start_time,请参见edit1064-您的SQL语法有错误;查看与MySQL服务器版本对应的手册,了解第7行“from edu_courses join edu_Cours on cour”附近使用的正确语法。。。1054-未知列“edu_courses.\u id”在“on”子句中“我确信该列在edu_courses中被称为\u id”,但错误是针对\u id列,您在edu_courses表中有此字段吗?发布教育大学课程展示栏的结果;好的,你的答案几乎是正确的。现在已经创建了视图,但我看到的课程与课程中的课程一样多。例如:如果课程1有两节课,则视图将显示课程的2倍。。。我只想看一次这门课,第一节课的开始日期…我使用你发布的第三个查询,但我还有一个问题。。。如果一门课程没有任何课程,则不会显示整个课程。但是,我希望它显示不包含课程的课程,然后将min_date_time设置为NULL