Как chceck is id используется в другом столбце той же таблицы
Я использую 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)
Я попытался LEFT JOIN к той же таблице и проверил, используя условие if, но код возвращает мне ошибочное значение.
Спасибо всем за помощь:)
5 ответов
Решение
Вы можете добавить логический флаг, используя коррелированный подзапрос или 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
С существует:
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
Используя левое соединение
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;
Решение с использованием кейсов и текстового вывода:
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
Использовать 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)