MariaDB - Как добавить (JOIN) еще один столбец из другой таблицы с помощью IF / ELSE - PullRequest
0 голосов
/ 28 июня 2018

У меня есть две таблицы с именами ARTICLE и SAVE.

ARTICLE таблица содержит все данные товара. И таблица SAVE имеет отношение между email и 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

Итак, если вы сохраните 3-ю статью под своей учетной записью (a@x.y), таблица SAVE будет изменена как ...

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

И я хотел бы создать (результат SELECT) еще один столбец в вызове ARTICLE 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 и мне может понадобиться условие IF/ELSE. Как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 28 июня 2018

Я решил эту проблему с ...

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.

0 голосов
/ 28 июня 2018

Вы, кажется, хотите 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;
0 голосов
/ 28 июня 2018

A 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.

0 голосов
/ 28 июня 2018

Сначала вы выбираете все статьи (пользователем) и делаете левое соединение с 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 существует в обеих таблицах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...