【问题标题】:MariaDB - How to add(JOIN) one more column from another table with IF/ELSEMariaDB - 如何使用 IF/ELSE 从另一个表中再添加(加入)一列
【发布时间】:2018-06-28 09:36:14
【问题描述】:

我有两个表,分别名为 ARTICLESAVE

ARTICLE 表包含整篇文章数据。而SAVE 表有emailARTICLEseq 之间的关系。

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

因此,如果您将第 3 篇文章保存到您的帐户 (a@x.y),SAVE 表将更改为...

SAVE
seq email    article_seq
3   ch@x.y   1
4   a@x.y    3

我想在文章调用is_saved 中再创建一列(SELECT 的结果)。我期待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 的两个表,我可能需要IF/ELSE 条件。我该怎么做?

【问题讨论】:

  • 请显示您为达到目标而尝试的查询。
  • 你能解释一下你的结果集背后的逻辑吗?
  • 我越仔细观察你的预期输出和你给定的输入,它就越没有意义。 :-S
  • 由于ch@x.y保存了seq为1的文章。(SAVE table)JOIN的结果为1,0,0(is_saved)。并且由于fm@x.ySAVE表中没有任何保存数据,所以结果为0,0,0(is_saved)
  • 换一种方式,无论您在列出所有文章时登录的人以及它们是否已保存标记。

标签: mysql sql mariadb


【解决方案1】:

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

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。

【讨论】:

    【解决方案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

    【讨论】:

    • 我认为应该更改IF(s.is_saved IS NULL, 1, 0) 部分。但是SAVE 表没有is_saved 列。我需要用它与当前用户的电子邮件进行比较。我怎样才能做到这一点?我想我应该做 ` if( seq in subquery 1, 0)`。
    【解决方案3】:

    你似乎想要EXISTS

    select *, (case when exists (select 1 from SAVE s where s.article_seq = a.seq)
                    then 1 else 0
               end) as is_saved
    from ARTICLE a;
    

    【讨论】:

      【解决方案4】:

      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 中最多出现一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-18
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        • 2021-01-11
        • 2020-01-23
        • 2021-11-21
        相关资源
        最近更新 更多