Is this for a classroom project? Sounds like it. So, again the logic of your processes do not make a lot of sense. I will try to explain.
There are hundreds of ways to match tables against each other. JOIN’s are one. JOIN’s are actually three or four different ones depending on how you need the tables attached to each other. Also, quite often in SQL/MySQL/PDO, you have to select the results of a previous select. Sometimes you need to select a group of data and then join that results. The logic of the process makes the decision how to do that. Therefore, you have to think the logic out for what you really need. This is how you solve any programming task. If you get the logical process figured out, the coding of it is very simple.
In your case the most important thing you need is the full count of how many career classes each person used. That would be one select. So, the logic says, get that number first. Then, join the names of the class-career with that list and the total count will be zero for the ones not in the list. Not the other way around. In your final output, you do not even want the career listed, I mean the name, so it does not even need to be in the process at all. Does that make sense?
Now, the final process needs some new items added in. They are called “aliases”. You basically assign names to tables or results of selects. This is common in queries and lets you create a select or join and assign a temporary name to it. I used T1 and T3 for the new table names. These are temporary and have nothing to do with the actual tables or data, just a way to name groups of data in a query.
So, this solution should work for you:
SELECT T1.name, T1.surname, IFNULL(COUNT(T3.carerid), 0) AS total
FROM first AS T1
LEFT JOIN three AS T3
ON T1.id = T3.fullnameid
GROUP BY T1.id
I think this should work for you.