繁体   English   中英

如何选择所有结果中列值相同的记录集

[英]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

关于dbfiddle的工作示例

您没有提到您正在使用的MySQL版本,我通常使用CTE而不是子查询,但您可能还没有使用此功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM