Unfortunately MySQL lack support for analytic functions. Particularly RANK() and RANK_DENSE().
To emulate RANK() you can do
SELECT pno, total_hours, rank
  FROM
( 
  SELECT pno, total_hours,
         @n := @n + 1 rnum, @r := IF(@h = total_hours, @r, @n) rank, @h := total_hours
    FROM
  (
    SELECT pno, SUM(hours) total_hours
      FROM works_on 
     GROUP BY pno
  ) q CROSS JOIN (SELECT @n := 0, @r := 0, @h := NULL) i
   ORDER BY total_hours DESC, pno
) t
Sample output:
| PNO | TOTAL_HOURS | RANK |
|-----|-------------|------|
|   3 |          61 |    1 |
|   1 |          40 |    2 |
|   2 |          40 |    2 |
|   4 |          10 |    4 |
To emulate DENSE_RANK() you can do
SELECT pno, total_hours, rank
  FROM
(
  SELECT pno, total_hours,
         @r := IF(@h = total_hours, @r, @r + 1) rank, @h := total_hours
    FROM
  (
    SELECT pno, SUM(hours) total_hours
      FROM works_on 
     GROUP BY pno
  ) q CROSS JOIN (SELECT @r := 0, @h := NULL) i
   ORDER BY total_hours DESC, pno
) t
Sample output:
| PNO | TOTAL_HOURS | RANK |
|-----|-------------|------|
|   3 |          61 |    1 |
|   1 |          40 |    2 |
|   2 |          40 |    2 |
|   4 |          10 |    3 |
Note: You can ditch outer SELECTs if you don't mind to have one or two extra columns in your resultset.
Here is SQLFiddle demo