find the beginning and ending values of sequential runs This article does the inverse of what I need:  Find which numbers in [1, 161] are not in the result set?

Given the sample data they used:  

mysql&gt; CREATE TABLE wp_blogs
    -&gt; (
    -&gt;   blog_id INTEGER
    -&gt; );

mysql&gt; insert into wp_blogs values(1);
mysql&gt; insert into wp_blogs values(2);
mysql&gt; insert into wp_blogs values(4);
mysql&gt; insert into wp_blogs values(6);
mysql&gt; insert into wp_blogs values(7);
mysql&gt; insert into wp_blogs values(8);
mysql&gt; insert into wp_blogs values(10);


this query answers the question, "What are the gaps?":

mysql&gt; SELECT a.blog_id+1 AS start, MIN(b.blog_id) - 1 AS end
    -&gt;     FROM wp_blogs AS a, wp_blogs AS b
    -&gt;     WHERE a.blog_id &lt; b.blog_id
    -&gt;     GROUP BY a.blog_id
    -&gt;     HAVING start &lt; MIN(b.blog_id);

+-------+------+
| start | end  |
+-------+------+
|     3 |    3 |
|     5 |    5 |
|     9 |    9 |
+-------+------+


What I want to know is what are the islands?
I would like to see output like this:

+-------+------+  
| start | end  |  
+-------+------+  
|     1 |    2 |  
|     4 |    4 |  
|     6 |    8 |  
|    10 |   10 |  
+-------+------+  


but I can't quite figure out the query to do so.  I am using MySQL 5.6.

Anyone have a solution?
To keep all the state information with the current row to avoid having conditions you can so something like: 

SELECT start, max(end) FROM (
    SELECT 
        CASE WHEN blog_id = @prev + 1 THEN @start:=@start ELSE @start:=blog_id END AS start, 
        blog_id AS end,  
        @prev:=blog_id 
    FROM (SELECT @prev:=NULL, @start:=NULL) AS vars
    JOIN wp_blogs
) a 
GROUP BY start;

+---------+------------+
|   start |   max(end) |
|---------+------------|
|       1 |          2 |
|       4 |          4 |
|       6 |          8 |
|      10 |         10 |
+---------+------------+
4 rows in set
Time: 0.003s