Call all from TABLE A > Only call certain things from TABLE B > Check if TABLE B has anything matching TABLE A in a certain column, discard anything that doesn't > Check if TABLE C has anything that matches any of the results that TABLE A and TABLE B sorted PLUS check and see if it matches the other value, if it doesn't then discard that too, then list all the results in the order requested?
More or less, except for the case of the LEFT JOIN (Table C) nothing is discarded if there are no matches. Instead of discarding the row it is "joined" to a single row consisting of all NULL values. Basically any field from Table C would just have the value NULL when selected.
Does seperating the GROUP BY items with a comma mean that both values have to be there to group them? For example calling GROUP BY for just JobNumber would show only 1 JobNumber 1, and using ClientID would show only one of Client ID 12345's jobs, but by using both values it's showing all of that Client's jobs?
As I said, you can think of it as creating a bunch of little boxes to hold the different rows. Each box is labeled by the columns listed in the GROUP BY clause. See the diagram, might help make sense of it. Based on my fiddle above.
As for your first point about not using * is that just an issue when calling from more than one table? Or an issue all the time?
In applies to both. You may see it a lot in example queries on the forums and such simply because it's easier to type and we often do not know what a user's column names actually are. When writing your actual queries though you should not use it. I use it in only two cases:
1) On the forums sometimes when posting sample queries
2) When building/debugging queries during development in a tool like Mysql Workbench/PhpMyAdmin.
Once the query is working propery and ready to be put into your script, list out the columns you need.
Take for example a setup like these forums. On the forum listing page all you really need is the title, ID#, and author name of each topic. You don't need the post data or any extra author info. If you were use * you'd get all that extra junk though which is just going to eat up unecessary memory in PHP and bandwidth between PHP and the sql server. As an added benefit if by chance all the columns you need are indexed mysql can pull the values straight from the index and not have to hit the table's datastore at all which lets the query run entirely in RAM and not have to wait for any disk I/O which is the main cause of slowness.
Also, where the tables are called and the names seem shorter for example c.ClientID j.JobNumber where abouts is that set?
In the from and join clauses I set the alias for the table.
FROM Clients c
INNER JOIN Jobs j
The c and j are the table aliases. That bit essentially means "...From the Clients table (which will now be known as 'c') Join with the Jobs table (which will now be known as 'j') ..."