SQL установить для столбца значение true, если выполняются некоторые условия - PullRequest
0 голосов
/ 16 апреля 2020

Получил 3 стола, сказал

почта

{
  id: number,
  content: string
}

игрок

{
  id: number,
  name: string
}

is_mail_read

{
  mail_id: number,
  player_id: number
}

Чего я хочу достичь:

Если указан player_id, вернуть письма со столбцом is_read, который имеет значение true (или 1), если в is_mail_read есть запись, и false, если ее нет.

Для пример:

[
  {  
    id: 2,
    content: "I am a mail",
    is_read: true
  },
  {  
    id: 3,
    content: "I am a mail too",
    is_read: false
  },...
]

Я пытался покинуть соединение, но не знал, что делать дальше. База данных MariaDB.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Я бы использовал exists:

select m.*,
       (exists (select 1
                from is_mail_read imr
                where imr.mail_id = m.id and
                      imr.player_id = ?  -- your desired player id
               )
       ) as read_flag
from mail m;
1 голос
/ 16 апреля 2020

Вы на правильном пути, используя LEFT JOIN. Теперь вы просто проверяете, существует ли запись в таблице mail для записи в таблице player, проверяя, является ли объединенная запись NULL или нет.

Я предполагаю, что вы хотите отобразить все письма и вернуть информацию, если письмо прочитано для определенного c игрока. Затем вы должны фильтровать игрока в предложении JOIN, а не в предложении WHERE. Если вы сделаете это в предложении WHERE, вы неявно превратите LEFT JOIN в INNER JOIN. За исключением случаев, когда вы пишете предложение WHERE, например

WHERE p.name = "John" OR p.name IS NULL 

Таким образом, ваш запрос должен выглядеть следующим образом:

SELECT
m.id,
m.content,
IF(p.id IS NULL, false, true) AS is_read
FROM 
mail m
LEFT JOIN is_mail_read imr ON m.id = imr.mail_id
LEFT JOIN player p ON imr.player_id = p.id AND p.name = "John"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...