Как chceck is id используется в другом столбце той же таблицы - PullRequest
0 голосов
/ 07 июля 2019

Я использую MariaDB 10.3, и у меня есть таблица как:

post_id post_content post_user_id post_shared
1       Test1        1             0
2       Test2        2             0
3       Test2        1             2

post_shared = 0 означает, что это оригинальное сообщение и не передается.

Я ищу способ узнать, был ли пост опубликован конкретным пользователем (исходя из post_user_id). Пример вывода следующий:

post_id isShared                     ( post_user_id 1)
1       0 (false)
2       1 (true)
3       0 (false)

Я попытался выполнить левое соединение с той же таблицей и проверил, используя условие if, но код возвращает мне ошибочное значение.

Спасибо всем за помощь :)

Ответы [ 5 ]

1 голос
/ 07 июля 2019

Вы можете добавить логический флаг, используя коррелированный подзапрос или left join. Если дубликатов нет:

select t.*, (ts.post_id is not null) as isShared
from t left join
     ts
     on ts.post_shared = t.post_id and
        ts.post_user_id = 1;

В качестве коррелированного подзапроса это выглядит так:

select t.*,
       (exists (select 1
                from ts
                where ts.post_shared = t.post_id and
                      ts.post_user_id = 1
               )
       ) as isShared
0 голосов
/ 07 июля 2019

Решение с использованием кейсов и текстового Вывода :

SELECT *,
CASE

    WHEN post_shared > 0 THEN 'This story has been shared' 
    ELSE 'This story has not been shared' 

END AS share_status
FROM Test
0 голосов
/ 07 июля 2019

Использование левого соединения

SELECT t1.post_id, IF(t2.post_id IS NULL, FALSE, TRUE)
FROM Test as t1
LEFT JOIN Test as t2 ON (t1.post_id = t2.post_shared and t2.post_user_id = 1)
order by t1.post_id;
0 голосов
/ 07 июля 2019

С существует:

select
  t.post_id,
  case when exists (
      select 1 from tablename
      where post_id <> t.post_id
      and post_shared = t.post_id
    ) then 1 
    else 0
  end isShared                     
from tablename t
0 голосов
/ 07 июля 2019

использовать corealted подзапрос

select t1.* from table_name t1
where exists( select 1 from table_name t2 where t1.post_user_id=t2.post_user_id
                          and post_shared<>0)
...