Change your query from:
SELECT
COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url
FROM '.$wpdb->comments.'
WHERE comment_author_email != "" AND comment_type = "" AND comment_approved = 1
GROUP BY comment_author_email
ORDER BY comments_count DESC, comment_author ASC
LIMIT '.$amount
To:
SELECT *,
COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url
FROM '.$wpdb->comments.'
WHERE comment_author_email != "" AND comment_type = "" AND comment_approved = 1
GROUP BY comment_author_email
ORDER BY comments_count DESC, comment_author ASC
LIMIT '.$amount
And then this:
$output .= "<li><a href="https://wordpress.stackexchange.com/questions/108024/.$result->comment_author_url.">".$result->comment_author."</a> (".$result->comments_count.")</li>";
To:
$output .= "<li><a href="https://wordpress.stackexchange.com/questions/108024/.get_author_posts_url($result->user_id).">".$result->comment_author."</a> (".$result->comments_count.")</li>";
Modifying the query grants you to reach all fields, one of these ( user_id ), will be used to get the author’s page with get_author_posts_url();
Update
I suggest you to use double quote on SQL strings and single quote on HTML.
In your code you’re trying to concatenate $output with nothing.
So your queries might look like this:
"
SELECT *,
COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url
FROM $wpdb->comments
WHERE comment_author_email != '' AND comment_type="" AND comment_approved = 1
GROUP BY comment_author_email
ORDER BY comments_count DESC, comment_author ASC
LIMIT $amount
"
Then for $output:
$output="<ul>";
foreach($results as $result) {
$output .= '<li><a href=""https://wordpress.stackexchange.com/questions/108024/.get_author_posts_url($result->user_id)."">'.$result->comment_author.'</a> ('.$result->comments_count.')</li>';
}
$output .= '</ul>';
Hope it helps!