Вы на правильном пути, используя 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"