* Robert Kilroy
> I've been trying to work out a query for this project
> and I'm finally at the end of my rope. Basically, I
> have a ticket sales app. There is a table that has
> row_num and seat_num and seat_status. What I need to
> do is retrieve X number of seats that are sequential.
> For example, if someone requests 4 seats, and seats 1
> and 2 are sold, he would get seats 3, 4, 5, 6. Or if
> seats 5, 6 are sold he would get 7, 8, 9, 10.

Try a grouped self join:

SELECT t1.row_num,t1.seat_num,COUNT(t2.seat_num)+1 AS "seats"
  FROM theater t1
  LEFT JOIN theater t2 ON
    t2.row_num = t1.row_num AND
    t1.seat_num < t2.seat_num AND
    t2.seat_num < t1.seat_num + 4 AND
    t2.seat_status="free"
  WHERE
    t1.seat_status="free"
  GROUP BY
    t1.row_num,t1.seat_num
  HAVING
    seats = 4;

This example finds 4 seats, both occurences of the digit "4" in the above
query needs to be dynamic, and changed to whatever number of seats you want
to find. You can also find seats "in the back" or "in the front" by adding a
check in the WHERE clause on t1.row_num larger or smaller than whatever is
the middle seat row in the theatre.

Explanation of the query: First we read all free seats
(t1.seat_status="free"), then we join to the same table, finding all free
seats on the same row (t2.row_num = t1.row_num), with a higher seat number
(t1.seat_num < t2.seat_num), but smaller than the current seat from t1 + 4
(t2.seat_num < t1.seat_num + 4 ), because we want to find 4 seats.

The counter is one off, because we don't count the first seat from t1, that
is why you need to add 1 to the COUNT().

Then we use GROUP BY to get one result row per seat, and finally HAVING to
select only the free seats with 3 free seats next to it.

HTH,

--
Roger


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to