In very basic SQL it can be done with a statement doing something using WHERE EXISTS / NOT EXISTS
like (in pseudo code, real SQL statement follows):
select messages-from-laura
where exists(message-from-vick-with-same-id)
and not exist(message-from-someone-else with same-id)
same-id refering to laura-message id.
This is standard SQL, it works in postgresql, mssql (tested with both) and probably with others.
select *
from messages laura_messages
where concerned_user = 'laura'
and (exists (select 1 from messages vick_messages
where vick_messages.message_id = laura_messages.message_id))
and not exists (select 1 from messages other_messages
where other_messages.message_id = laura_messages.message_id
and other_messages.concerned_user not in ('laura','vick'))
Note the use of aliases for the main table and subqueries tables
(in SQL, you can add an alias name after the table name in the FROM TableName clause)
and the reference of the first message id in EXISTS subqueries.
Note also that you don't need to return something in subqueries, just that some data exists, so doing SELECT 1 is fine.
And you could write the equivalent query with joins but the optimizer is very good at rewriting queries so it would probably be the same, this one is simpler imho.
Or you could also use GROUP or something more sophisticated, the nice thing with sql is that you often have several possibilities to write the same query :)