MariaDB-如何使用IF / ELSE从另一个表中添加(JOIN)一列

时间:2018-06-28 09:36:15

标签: mysql sql mariadb

我有两个名为ARTICLESAVE的表。

ARTICLE表包含整个文章数据。并且SAVE表具有email的{​​{1}}和seq之间的关系。

ARTICLE

因此,如果用您的帐户(ARTICLE seq email title content 1 fm@x.y ya hah 2 ch@x.y ho hihi 3 ch@x.y yo hoho SAVE seq email article_seq 3 ch@x.y 1 )保存第三篇文章,a@x.y表将被更改为...

SAVE

我想在ARTICLE调用SAVE seq email article_seq 3 ch@x.y 1 4 a@x.y 3 中再创建一列(SELECT的结果)。我希望得到is_saved的结果:

当我以SELECT登录

ch@x.y

当我以RESULT seq email title content is_saved 1 fm@x.y ya hah 1 2 ch@x.y ho hihi 0 3 ch@x.y yo hoho 0 登录

fm@x.y

因此,我需要基于RESULT seq email title content is_saved 1 fm@x.y ya hah 0 2 ch@x.y ho hihi 0 3 ch@x.y yo hoho 0 JOIN这两个表,并且我可能需要ARTICLE条件。我该怎么办?

4 个答案:

答案 0 :(得分:2)

首先,您(由用户)选择所有文章,然后对文章seq id进行左连接。您需要左连接来区分已保存(行存在)和未保存(行不存在)。

SELECT
  *,
  IF(s.is_saved IS NULL, 1, 0) as 'is_saved'
FROM 'ARTICLE' a
LEFT JOIN 'SAVE' s
  ON a.seq = s.article_seq
WHERE a.email = :email

由于两个表中都存在email,因此您似乎也有冗余。

答案 1 :(得分:2)

您似乎想要from datetime import datetime, timezone, timedelta now = datetime.now(timezone.utc) epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) # use POSIX epoch posix_timestamp_micros = (now - epoch) // timedelta(microseconds=1) event_time = lambda:str(posix_timestamp_micros // 1000)

EXISTS

答案 2 :(得分:2)

left join是表达这一点的自然方法:

select a.*,
       (s.seq is not null) as is_saved
from article a left join
     save s
     on a.seq = s.article_seq and
        a.email = s.email;

这假设seq / email的组合最多可以在save中出现一次。

答案 3 :(得分:2)

我用...解决了这个问题

SELECT *,
  (CASE WHEN EXISTS
    (SELECT 1
      FROM save s
        WHERE a.seq = s.article_seq AND s.email=?)
    THEN 1 ELSE 0 END)
  AS is_saved
FROM article a;

?是登录用户的电子邮件。如果您可能知道Node.js或Spring(服务器端)。您可能理解我的意思。您将?用作不确定参数。 例如,您不知道当前哪个人登录。此时,您需要使用问号,以便正确的数据进入SQL。