【问题标题】:Create View query of 2 tables (with data from 3 tables)创建 2 个表的视图查询(来自 3 个表的数据)
【发布时间】:2016-07-26 22:12:08
【问题描述】:

我想进行一个查询,将 2 个表组合成一个视图。但是要获取所有需要的数据,我还必须查询第三个表(但此表不必出现在视图中)。它只需执行以下操作(用普通英语编写):

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

那么

edu_lessons获取所有记录,其中course_id等于edu_courses_id字段/strong>

那么

edu_lessons_dates获取所有记录,其中lesson_id等于edu_lessons_id字段/strong>

那么

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

最终

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

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

'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

【问题讨论】:

  • 你的查询有什么问题(除了那个语法错误额外的逗号)?
  • 我在结果中看不到 end_date 或 end_time。即使我在查询中选择 dates.start_date 和 dates.start_time(见编辑)
  • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 7 行的“from edu_courses course join edu_lessons les on cour”附近使用正确的语法

标签: mysql sql join view union


【解决方案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)或间隔并且 start_date 是日期(日期时间类型)时,它才能正常工作。如果此字段有其他类型,则必须在 sum 之前对其进行转换。
编辑:
对于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

【讨论】:

  • 奇怪...#1054 - 'on Clause' 中的未知列 'edu_courses._id'
  • 我确定该列在edu_courses中被称为_id
  • 但是 _id 列有错误,你在 edu_courses 表中有这个字段吗?发布来自 edu_courses 的 SHOW COLUMNS 的结果;
  • 好的,你的答案几乎是正确的。现在创建了视图,但我看到的课程与课程的课程一样多。例如:如果课程 1 有两节课,则视图将显示该课程的 2 次...我只想查看该课程一次,以及该课程第一节课的 start_date...
  • 我使用了您发布的第三个查询,但我仍然有一个问题...当课程根本没有课程时,不会显示整个课程。但是,我希望显示不包含任何课程的课程,然后将 min_date_time 设置为 NULL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多