• Каким должен быть запрос?

    @kolyan83 Автор вопроса
    В этом случае он возвращает такой же результат как если было бы:

    WHERE c.virtual_id IN ('ind_4_9', 'ind_4_20', 'ind_4_32', 'all', 'all_teachers', 'all_students')

    (для "общих" сообщений virtual_id именно такие (совпадают с type)). Т.е. на выходе таблица вида:

    virtual_id  | cnt | last_message_id
    --------------------------------------------------------
    ind_4_9     | 3   | 430
    ind_4_20    | 5   | 333
    ind_4_32    | 2   | 460
    all         | 30  | 300
    all_teachers| 10  | 333
    all_students| 8   | 301

    и данные для all, all_teachers, all_students считаются так, что id этих не прочитанных сообщений больше чем chat_message_read.last_read_message_id каждого соответствующего общего чата, а не индивидуального. А надо чтобы было так: для чата ind_4_9 количество равно: его собственные сообщения + общие, но чтобы id и тех и других были больше чем значение chat_message_read.last_read_message_id в соответствующей строке этого индивидуального чата ind_4_9 (либо 0 если строки не существует).
  • Каким должен быть запрос?

    @kolyan83 Автор вопроса
    Лентюй, будет считаться что не видел не одного. Вот в подзапросе: SELECT IF(count(*) > 0, rcm.last_chat_message_id, 0)
  • Каким должен быть запрос?

    @kolyan83 Автор вопроса
    Лентюй, эта логика за пределами этих 3х таблиц. Но в данном случае можно считать, что массив virtual_id внутри запроса состоит из тех чатов которые нужны. И в нём нет чатов к которым у пользователя нет доступа.