I suspect that this is MASSIVELY over-convoluted - but I seem to be having a senior moment, so...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id_clocking INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,project_id INT NOT NULL
,date DATE NOT NULL
,comments VARCHAR(20) NULL
,next_steps VARCHAR(20) NULL
,dependencies VARCHAR(20) NULL
);
INSERT INTO my_table VALUES
(1,39,'2014-08-01','new_com','step1','dependency1'),
(2,39,'2014-08-10',NULL,'step2',NULL),
(3,39,'2014-08-12',NULL,'step3','dependencyx'),
(4,39,'2014-08-05','commentx','stepx','depend'),
(5,42,'2014-07-15',NULL,NULL,'dependency_3'),
(6,42,'2014-07-03','comment_3','step_c','dependency_4'),
(7,42,'2014-08-01',NULL,'step_d',NULL);
SELECT i.project_id
, j.comments
, k.next_steps
, l.dependencies
FROM
( SELECT project_id
, MAX(CASE WHEN type = 'comment' THEN max_date END) comment_date
, MAX(CASE WHEN type = 'next_steps' THEN max_date END) next_steps_date
, MAX(CASE WHEN type = 'dependencies' THEN max_date END) dependencies_date
FROM
( SELECT a.project_id
, a.type
, MAX(a.date) max_date
FROM
( SELECT project_id
, date
, 'comment' type
, comments FROM my_table
WHERE comments IS NOT NULL
UNION
SELECT project_id
, date
, 'next_steps'
, next_steps
FROM my_table
WHERE next_steps IS NOT NULL
UNION
SELECT project_id
, date
, 'dependencies'
, dependencies
FROM my_table
WHERE dependencies IS NOT NULL
) a
GROUP
BY project_id
, type
) m
GROUP
BY project_id
) i
JOIN my_table j
ON j.project_id = i.project_id
AND j.date = i.comment_date
JOIN my_table k
ON k.project_id = i.project_id
AND k.date = i.next_steps_date
JOIN my_table l
ON l.project_id = i.project_id
AND l.date = i.dependencies_date;
+------------+-----------+------------+--------------+
| project_id | comments | next_steps | dependencies |
+------------+-----------+------------+--------------+
| 39 | commentx | step3 | dependencyx |
| 42 | comment_3 | step_d | dependency_3 |
+------------+-----------+------------+--------------+
This seems like a simpler solution... (and faster too: http://sqlfiddle.com/#!2/b9552e/5)
SELECT x.project_id
, c.comments
, n.next_steps
, d.dependencies
FROM
( SELECT project_id
, MAX(CASE WHEN comments IS NOT NULL THEN date END) comments_date
, MAX(CASE WHEN next_steps IS NOT NULL THEN date END) next_steps_date
, MAX(CASE WHEN dependencies IS NOT NULL THEN date END) dependencies_date
FROM my_table
GROUP
BY project_id
) x
JOIN my_table c
ON c.project_id = x.project_id
AND c.date = x.comments_date
JOIN my_table n
ON n.project_id = x.project_id
AND n.date = x.next_steps_date
JOIN my_table d
ON d.project_id = x.project_id
AND d.date = x.dependencies_date
WHERE c.comments IS NOT NULL
AND n.next_steps IS NOT NULL
AND d.dependencies IS NOT NULL;
+------------+-----------+------------+--------------+
| project_id | comments | next_steps | dependencies |
+------------+-----------+------------+--------------+
| 39 | commentx | step3 | dependencyx |
| 42 | comment_3 | step_d | dependency_3 |
+------------+-----------+------------+--------------+