REVISED ANSWER
This can be accomplished in two step process.
Create a very plain view to only show node titles. Do not filter it except by type if you wish, and do not place any contextual filters on it. For this answer I created a view called 'not_commented' with a page display of 'page_1'.
Create a custom module. We will use it to alter the views query. For this answer I created a module called 'custom'.
Add this code to custom.module:
function custom_views_api(){
return array(
'api' => 3,
'path' => drupal_get_path('module', 'custom') . '/includes/views',
);
}
Now create a folder 'includes' in the module folder, and then a folder 'views' inside the includes folder so that the folder structure is : sites/all/modules/custom/includes/views
Create a file custom.view.inc
within folder views
. Place this code in the file:
<?php
function custom_views_query_alter(&$view, &$query){
if ($view->name == "not_commented" && $view->current_display == "page_1"){
// get all nodes commented on by this author
$sql = "SELECT n.nid, COUNT(n.nid) " .
"FROM {node} n LEFT JOIN {comment} c ON n.nid = c.nid " .
"WHERE (c.uid = :uid AND n.status = '1') GROUP BY n.nid";
global $user;
$query_2_result = db_query($sql, array(':uid' => $user->uid))->fetchAllKeyed(0,0);
$query->where[1]['conditions'][] = array(
'field' => 'node.nid',
'value' => $query_2_result,
'operator' => 'not in',
);
}
}
Clear you cache.
Please replace module and views/display names etc. as applicable. If there are any problems please inspect the $query object to see if you have the right where array key etc.