我正在建立一个受指定座位数限制的查询,该查询从一个座位图中选择了一组座位,座位图被分为多个部分。
它将尝试从同一部分中获取所有所需的座位,但是如果该部分没有足够的座位来满足请求的数量,它将从下一部分中获取剩余的座位。
不好。
虽然我可能可以找出一种复杂的PHP方法来获取我的结果集,检查一个以上的部分,如果可以,请跳过该部分中没有足够数量的前几个可用席位,然后再次重新查询以确保在下一节中获得所有需要的座位。
哇!乱。
但是,我想在SQL中弄清楚这一点。下面的代码。
SELECT et.id, et.event_id, et.seat_id, et.zone_id, s.seat_number, r.row_name, r.row_priority, sc.section_name, sc.section_priority, z.zone_name, s.seat_handicap, s.seat_obstructed, ticket_base_price, yth_boxoffice_ticket_fee, yth_online_ticket_fee, vendor_boxoffice_ticket_fee, vendor_online_ticket_fee
FROM yth_event_tickets et
LEFT JOIN yth_seats s ON et.seat_id = s.id
RIGHT JOIN yth_seatmap_rows r ON s.seat_row_id = r.id
RIGHT JOIN yth_seatmap_sections sc ON r.row_section_id = sc.id
RIGHT JOIN yth_seatmap_zones z ON sc.section_zone_id = z.id
WHERE event_id = 101252413
AND zone_id = 1
AND ticket_status = 1
AND s.seat_active = 1
ORDER BY r.row_priority ASC, sc.section_priority ASC, s.seat_priority ASC
LIMIT 4
我先按行排序,然后按节排序。这样,它绕过体育场并从每个分区中抢先获得第一行,并在填充后从第二行开始,依此类推,以便选择“最佳可用”。
如您所见,我只想要4个席位。我在B部分获得2个席位,但B部分已满,因此我从C部分获得了剩余的2个席位。我想做的就是跳过B部分中的最后2个席位,让我的4个席位C部分的席位。此外,如果C部分仅剩下<4个席位,则也跳过它,然后转到D部分,依此类推...
答案 0 :(得分:0)
您是否要求所有座位都在同一排或仅在同一区域? 我想在同一行。
我不会尝试了解您的所有桌子,所以我可以想象您有一个座位视图:
区域,rowno,seatno
;WITH avail AS (SELECT TOP 1 zone,rowno FROM seats -- find the first row with 4 or more seats
GROUP BY zone,rowno
HAVING COUNT(*) >=4
ORDER BY zone,rowno)
-- select the first 4 seats from that row.
SELECT top 4 seats.* FROM avail INNER JOIN seats
ON avail.zone = seats.zone AND avail.rowno=seats.rowno
ORDER BY seatno
答案 1 :(得分:0)
首先,计算每个部分(或每个区域,部分,行-您需要的位置)的可用座位数,例如:
SELECT se.id, COUNT(*) AS seats_available
FROM yth_seats s
JOIN yth_rows r
ON s.row_id = r.id
JOIN yth_sections se
ON se.id = r.section_id
WHERE status = 1
GROUP BY se.id
这样,您就可以将该信息重新加入到主查询中,从而将结果限制在具有足够席位的部分:
SELECT s.*
FROM (SELECT se.id, COUNT(*) AS seats_available
FROM yth_seats s
JOIN yth_rows r
ON s.row_id = r.id
JOIN yth_sections se
ON se.id = r.section_id
WHERE STATUS = 1
GROUP BY se.id) section_available
JOIN yth_sections se
ON se.id = section_available.id
JOIN yth_rows r
ON r.section_id = se.id
JOIN yth_seats s
ON s.row_id = r.id
WHERE s.status = 1
AND section_available.seats_available >= 4
-- your priorities
ORDER BY se.NAME
LIMIT 4
您没有提到要使用哪个MySQL版本,通常我会使用CTE而不是子查询,但是您可能无法使用此功能。