Ok I see now the problem. When you do a count(), it's going to return the number of total rows that would normally be returned by that query. With your JOIN query, you are going to get all of the rows from `serviceline` with matching ID, and all of the rows from `process` with matching ID. Selecting a count is, as you have found, going to return the total number of rows in the query result.
There is a way to narrow the count() in a result set using a subset of the result... maybe you could apply it here (I don't know if this will work):
Code:
SELECT
us.description,
us.user_id,
count(sl.ud_serviceline_id = us.schema_id OR NULL) AS sl_count,
count(pr.process_id = us.schema_id OR NULL) AS pr_count
FROM user_schemas us
LEFT JOIN servicelines sl ON us.schema_id = sl.schema_id
LEFT JOIN processes pr ON pr.schema_id = us.schema_id
WHERE us.user_id = 3;
BTW I really see no reason for the "GROUP BY" clause since the value of sl.schema_id will be the same for the entire result set.