Return 其中 or 语句结果来自 SQL
Return in which or statement results are from SQL
我有以下SQL声明,针对return老师喜欢的工作表,以及老师自己制作的工作表。
SELECT worksheets.title, worksheets.worksheet_id
FROM worksheets
WHERE worksheets.worksheet_id
IN (
SELECT worksheet_id FROM likes WHERE teacher_id = 5
) OR worksheets.worksheet_id
IN (
SELECT worksheet_id FROM worksheets WHERE teacher_id = 5
)
它工作正常,但现在我还想 return 如果工作表被点赞或由老师制作。我怎么做?我用 if 语句尝试了一些事情,但找不到可行的解决方案。
left join
和条件逻辑怎么样?
select w.title, w.worksheet_id,
(w.teacher_id = 5) as is_made,
(l.worksheet_id is not null) as is_liked
from worksheets w
left join from likes l
on l.worksheet_id = w.worksheet_id and l.teacher_id = 5
where w.teacher_id = 5 or l.worksheet_id is not null
这会将“制作或喜欢”信息放在两个不同的列中(毕竟,老师可以制作 并且 喜欢工作表)。
OR
有时会降低性能。 union all
可能更有效率:
select title, worksheet_id, max(is_made) as is_made, max(is_liked) as is_liked
from (
select title, worksheet_id, 1 as is_made, 0 as is_liked
from worksheets
where teacher_id = 5
union all
select w.title, w.worksheet_id, 0, 1
from worksheets w
where exists (select 1 from likes l where j.teacher_id = 5 and l.worksheet_id = w.worksheet_id)
) t
group by title, worksheet_id
您只需要稍作改动,保留 IN
运算符,例如
SELECT title, worksheet_id
FROM worksheets
WHERE worksheet_id IN (
SELECT worksheet_id FROM likes WHERE teacher_id = 5
)
OR teacher_id = 5
或者您可以使用外部 JOIN
SELECT title, w.worksheet_id
FROM worksheets w
LEFT JOIN likes l
ON l.worksheet_id = w.worksheet_id
WHERE 5 IN (w.teacher_id ,l.teacher_id)
作为备选方案
但我不明白你所说的工作表被老师点赞或制作是什么意思,即使他们似乎需要条件和某些列,但如何?逻辑不清楚。
SELECT title, worksheet_id, IF(likes.worksheet_id IS NOT NULL, 'Likes', 'Worksheet') AS source
FROM worksheets
LEFT JOIN (SELECT worksheet_id FROM likes WHERE teacher_id = 5) AS likes ON worksheets.worksheet_id = likes.worksheet_id
WHERE worksheet_id
IN (
SELECT worksheet_id FROM likes WHERE teacher_id = 5
) OR worksheets.teacher_id = 5
试试这个,希望对你有帮助
我有以下SQL声明,针对return老师喜欢的工作表,以及老师自己制作的工作表。
SELECT worksheets.title, worksheets.worksheet_id
FROM worksheets
WHERE worksheets.worksheet_id
IN (
SELECT worksheet_id FROM likes WHERE teacher_id = 5
) OR worksheets.worksheet_id
IN (
SELECT worksheet_id FROM worksheets WHERE teacher_id = 5
)
它工作正常,但现在我还想 return 如果工作表被点赞或由老师制作。我怎么做?我用 if 语句尝试了一些事情,但找不到可行的解决方案。
left join
和条件逻辑怎么样?
select w.title, w.worksheet_id,
(w.teacher_id = 5) as is_made,
(l.worksheet_id is not null) as is_liked
from worksheets w
left join from likes l
on l.worksheet_id = w.worksheet_id and l.teacher_id = 5
where w.teacher_id = 5 or l.worksheet_id is not null
这会将“制作或喜欢”信息放在两个不同的列中(毕竟,老师可以制作 并且 喜欢工作表)。
OR
有时会降低性能。 union all
可能更有效率:
select title, worksheet_id, max(is_made) as is_made, max(is_liked) as is_liked
from (
select title, worksheet_id, 1 as is_made, 0 as is_liked
from worksheets
where teacher_id = 5
union all
select w.title, w.worksheet_id, 0, 1
from worksheets w
where exists (select 1 from likes l where j.teacher_id = 5 and l.worksheet_id = w.worksheet_id)
) t
group by title, worksheet_id
您只需要稍作改动,保留 IN
运算符,例如
SELECT title, worksheet_id
FROM worksheets
WHERE worksheet_id IN (
SELECT worksheet_id FROM likes WHERE teacher_id = 5
)
OR teacher_id = 5
或者您可以使用外部 JOIN
SELECT title, w.worksheet_id
FROM worksheets w
LEFT JOIN likes l
ON l.worksheet_id = w.worksheet_id
WHERE 5 IN (w.teacher_id ,l.teacher_id)
作为备选方案
但我不明白你所说的工作表被老师点赞或制作是什么意思,即使他们似乎需要条件和某些列,但如何?逻辑不清楚。
SELECT title, worksheet_id, IF(likes.worksheet_id IS NOT NULL, 'Likes', 'Worksheet') AS source
FROM worksheets
LEFT JOIN (SELECT worksheet_id FROM likes WHERE teacher_id = 5) AS likes ON worksheets.worksheet_id = likes.worksheet_id
WHERE worksheet_id
IN (
SELECT worksheet_id FROM likes WHERE teacher_id = 5
) OR worksheets.teacher_id = 5
试试这个,希望对你有帮助