Ответы Mail.ru: Mysql остановка выборки при первом соответствии условия.

Для решения этого вопроса можно применить два способа, которые условно можно назвать дифференциальным и интегральным.

Первый способ, дифференциальный, основан на определении для каждой строки, подходит ли она. Для этого требуются номера строк, получить которые можно с помощью оконных функций.

 SELECT * 
FROM (SELECT *, 
             ROW_NUMBER() OVER (ORDER BY id DESC) AS RowNum 
      FROM messages 
      WHERE dialog_id=3
     ) AS _  
WHERE RowNum<=50 OR read_status=false  
ORDER BY id DESC; 

Другой способ, интегральный, оперирует совокупностями записей, что более соответствует духу SQL.

 (SELECT * FROM messages WHERE dialog_id=3 ORDER BY id DESC LIMIT 50)  
UNION 
SELECT * FROM messages WHERE dialog_id=3 AND read_status=false  
ORDER BY id DESC; 

Обращаю внимание, что использовать надо именно UNION, а не UNION ALL, чтобы исключить дубликаты.