Как выбрать набор записей, в которых значение столбца одинаково во всех результатах - PullRequest
0 голосов
/ 06 апреля 2019

Я создаю запрос, ограниченный указанным количеством мест, который выбирает группу мест из карты мест, которая разделена на секции.

Он пытается получить все необходимые места из одной и той же секции, но если в этой секции недостаточно мест для удовлетворения запрошенного количества, он забирает оставшиеся места из следующей секции.

Не хорошо.

Хотя я, вероятно, могу найти в 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 места. Я получаю 2 места в Разделе B, но затем Раздел B заполняется, поэтому я получаю оставшиеся 2 места из Раздела C. Что я хотел бы иметь, так это пропустить последние 2 места в Разделе B и получить свои 4 места в Разделе C. Кроме того, если в Разделе C есть, скажем, <4 оставшихся мест, пропустите его и перейдите к Разделу D и т. д. </p>

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Сначала посчитайте количество доступных мест в секции (или в каждой зоне, секции, ряду - все, что вам нужно), например:

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 вместо подзапроса, но эта функция может быть еще недоступна для вас.

0 голосов
/ 07 апреля 2019

Требуется ли, чтобы все места были в одном ряду или только в одной зоне?Я полагаю, в том же ряду.

Я не собираюсь пытаться понять все ваши столы, поэтому я представлю, что у вас есть вид мест:

зона, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...