Получить значение столбца, если оно совпадает со значением другого столбца в той же таблице - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть таблица SQLite с комментариями вроде:

Id   | replyId | commentID_parentID | usernameChannelId | channelId
1    | NULL    | NULL               | a                 | g
2    | NULL    | NULL               | b                 | k
NULL | 1.k     | 1                  | a                 | p
NULL | 1.p     | 1                  | c                 | i
3    | NULL    | NULL               | d                 | h
NULL | 2.k     | 2                  | g                 | g

и таблица с каналами вроде:

Я хочу знать, какой пользователь (userChannelId) ответил на какого пользователя.

Итак, я беру строку с комментарием и проверяю:

  • Id == NULL? Тогда это ответ -> получить userChannelId, где commentID_parentID == Id
  • Id! = NULL? Тогда это главный комментарий -> userChannelId ответил на channelId

И результат должен быть:

userChannelId_Source | userChannelId_Target
a                    | g
b                    | k
a                    | a
c                    | a
g                    | b

Комментарий "d" не имеет записи, где commentID_parentID == Id, поэтому он пропущен .

Как я могу сделать это в SQL, когда я запрашиваю в той же таблице?

1 Ответ

0 голосов
/ 01 февраля 2020

Это довольно сложное требование, но я думаю, что условное самостоятельное соединение сделает это:

select t.usernameChannelId userChannelId_Source, 
  case 
    when t.id is not null then tt.channelId
    else tt.usernameChannelId 
  end userChannelId_Target 
from tablename t inner join tablename tt
on tt.id = coalesce(t.id, t.commentID_parentID)
and exists (
  select 1 from tablename 
  where commentID_parentID = t.id
  or (commentID_parentID is null and t.id is null)
)

См. демо . Результаты:

| userChannelId_Source | userChannelId_Target |
| -------------------- | -------------------- |
| a                    | g                    |
| a                    | a                    |
| c                    | a                    |
| b                    | k                    |
| g                    | b                    |
...