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

时间:2019-04-06 20:34:15

标签: mysql sql

我正在建立一个受指定座位数限制的查询,该查询从一个座位图中选择了一组座位,座位图被分为多个部分。

它将尝试从同一部分中获取所有所需的座位,但是如果该部分没有足够的座位来满足请求的数量,它将从下一部分中获取剩余的座位。

不好。

虽然我可能可以找出一种复杂的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部分,依此类推...

2 个答案:

答案 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

Working example on dbfiddle

您没有提到要使用哪个MySQL版本,通常我会使用CTE而不是子查询,但是您可能无法使用此功能。