Stai facendo un INNER JOIN, ma hai bisogno di un OUTER JOIN, in particolare un LEFT JOIN. Con un LEFT JOIN la tabella "a sinistra" è sempre unita, e se non c'è corrispondenza i campi della tabella a destra sono nulli. La differenza è spiegata molto bene in questa pagina di Wikipedia .
Quindi devi raggruppare le righe con lo stesso ID di invio e contare quante righe sono state raggruppate, facendo attenzione che se un invio ha solo un commento e un altro non ne ha, entrambi hanno 1 riga raggruppata... Se un invio non ha commenti , nella query successiva c.submissionid
sarà nullo, quindi
Il tuo SQL potrebbe essere
SELECT s.loginid, s.title, s.url, s.displayurl, l.username, c.submissionid,
IF(c.submissionid IS NULL, 0, COUNT(*)) AS countComments
FROM submission AS s
INNER JOIN login AS l ON l.loginid = s.loginid
LEFT JOIN comments AS c ON c.submissionid = s.id
GROUP BY (s.id)
ORDER BY s.datesubmitted DESC
LIMIT 10
Potrebbero esserci degli errori, non ho testato la query... Ma spero di averti dato l'idea giusta, ovvero la differenza tra outer join e inner join.