Robisz INNER JOIN, ale potrzebujesz OUTER JOIN, w szczególności LEFT JOIN. Z LEFT JOIN, tabela "po lewej" jest zawsze łączona, a jeśli nie ma korespondencji, pola tabeli po prawej są ustawiane na null. Różnica jest bardzo dobrze wyjaśniona na tej stronie Wikipedii .
Następnie musisz pogrupować wiersze o tym samym identyfikatorze zgłoszenia i policzyć, ile wierszy zostało zgrupowanych, uważając, aby jeśli jedno zgłoszenie zawierało tylko jeden komentarz, a inne nie ma żadnego, oba mają po jednym zgrupowanym wierszu... Jeśli jedno zgłoszenie nie zawiera komentarzy , w następnym zapytaniu c.submissionid
będzie zerem, więc
Twój SQL może być
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
Mogą być błędy, nie testowałem zapytania... Ale mam nadzieję, że podsunąłem Ci właściwy pomysł, czyli różnicę między złączeniami zewnętrznymi i wewnętrznymi.