Note: Each day only have one row record, and the dates are increasing with id increasing.
Solution 1: using self join 3 times
385 ms, 82%
SELECT DISTINCT s1.*FROM stadium AS s1, stadium AS s2, stadium AS s3WHERE s1.people >=100and s2.people >=100and s3.people >=100AND( (s1.id - s2.id =1AND s1.id - s3.id =2 ) --for rows in first placeOR (s2.id - s1.id =1AND s2.id - s3.id =2 ) --for rows in second placeOR (s3.id - s2.id =1AND s2.id - s1.id =1 ) --for rows in third place)ORDER BY s1.id;
Solution 2: using self join 5 times
SELECT t.*FROM stadium t LEFT JOIN stadium p1 ON t.id -1= p1.id LEFT JOIN stadium p2 ON t.id -2= p2.id LEFT JOIN stadium n1 ON t.id +1= n1.id LEFT JOIN stadium n2 ON t.id +2= n2.idWHERE (t.people >=100AND p1.people >=100AND p2.people >=100)OR (t.people >=100AND n1.people >=100AND n2.people >=100)OR (t.people >=100AND n1.people >=100AND p1.people >=100)ORDER BY id;
Solution 3: using UNION
386 ms, 82%
SELECT id, date, peopleFROM ( SELECT s1.id AS id, s1.date AS date, s1.people AS people FROM stadium AS s1 JOIN stadium AS s2 ON s2.id - s1.id =1 JOIN stadium AS s3 ON s3.id - s2.id =1 WHERE s1.people >=100AND s2.people >=100AND s3.people >=100)ASNewUNIONSELECT id, date, peopleFROM ( SELECT s2.id AS id, s2.date AS date, s2.people AS people FROM stadium AS s1 JOIN stadium AS s2 ON s2.id - s1.id =1 JOIN stadium AS s3 ON s3.id - s2.id =1 WHERE s1.people >=100AND s2.people >=100AND s3.people >=100)ASNewUNIONSELECT id, date, peopleFROM ( SELECT s3.id AS id, s3.date AS date, s3.people AS people FROM stadium AS s1 JOIN stadium AS s2 ON s2.id - s1.id =1 JOIN stadium AS s3 ON s3.id - s2.id =1 WHERE s1.people >=100AND s2.people >=100AND s3.people >=100)ASNewORDER BY id;