我想进行一个将 2 个表合并到一个 View 中的查询。但是要获得所需的所有数据,我还必须查询第三个表(但该表不必出现在 View 中)。它必须简单地执行以下操作(以普通英语编写):
从 edu_courses 获取所有记录(并记住 _id 字段)
然后
从 edu_lessons 获取所有记录,其中 course_id 等于 edu_courses< 的 _id 字段/强>
然后
从 edu_lessons_dates 获取所有记录,其中 lesson_id 等于 edu_lessons< 的 _id 字段/强>
然后
在 edu_lessons_dates 中搜索具有最接近 start_date
的记录(如果有两个相同的 start_date
字段,则它必须找到最接近的 开始时间
)
最终
将查询合并为单个输出(在 View 或其他内容中):
'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
最佳答案
试试这个:
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 是日期(日期时间类型)时,它才能正常工作。如果这个字段有其他类型,你必须在求和之前转换它。
编辑:
对于 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
您还可以从子查询创建 View ,并像在查询中使用表一样使用它
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
关于mysql - 创建 2 个表的 View 查询(使用 3 个表中的数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36452298/