[英]How to select a set of records where a column value is the same in all results
我正在建立一个查询,受限于指定的座位数,从座位图中选择一组座位,这些座位分为几个部分。
它试图从同一部分抓住所有需要的座位,但如果该部分没有足够的座位来满足所要求的数量,它将从下一部分抓住剩余的座位。
不好。
虽然我可能在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
我首先按行排序,然后按节排序。 这样,它绕过体育场并首先抓住每个部分的第一行,当它们被填充时,从第2行开始,依此类推,以便选择“最佳可用”。
如你所见,我只想要4个座位。 B部分获得2个席位,但B部分已满,所以我从C部分获得剩余的2个席位。我希望能够跳过B部分的最后2个席位并获得我的4个席位。 C部分的座位。此外,如果C部分只有<4个剩余座位,并且也跳过它,继续前进到D部分等等......
您是要求所有座位位于同一行还是仅位于同一区域? 我想在同一行。
我不打算去理解你所有的桌子,所以我想你会看到座位:
区,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
首先,计算每个部分(或每个区域,部分,行 - 无论您需要的)可用座位数,例如:
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而不是子查询,但您可能还没有使用此功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.