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)

作为备选方案

Demo

但我不明白你所说的工作表被老师点赞或制作是什么意思,即使他们似乎需要条件和某些列,但如何?逻辑不清楚。

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

试试这个,希望对你有帮助