Helpers - компьютеры, интернет, программирование

Как ограничить результаты подзапроса или соединения SQL

Давайте представим, что у меня есть 2 таблицы в MySQL, одна называется Vehicle, а другая — Passenger.

Если мне нужен полный список всех транспортных средств и их пассажиров, я могу сделать что-то вроде этого:

SELECT * 
  FROM Vehicle v 
  LEFT 
  JOIN Passenger p
    ON p.VehicleID = v.VehicleID 
 LIMIT 0,100

Проблема здесь в том, что давайте представим, что мои транспортные средства — это автобусы, и в первом автобусе 50 пассажиров, во втором автобусе — 40, а в третьем — 30. Ограничение 100 в приведенном выше запросе даст мне частичный список пассажиров третьего автобуса.

Есть ли способ создать такой запрос, который не будет разделять результаты из объединенной таблицы?

Или же вы можете применить LIMITS отдельно к разным таблицам? Итак, я мог бы сказать, что хочу ограничиться 10 транспортными средствами и 50 пассажирами на транспортное средство?

Логически примерно так:

SELECT * FROM Vehicle (LEFT JOIN Passenger ON Passenger.VehicleID = Vehicle.VehicleID LIMIT 0,50) LIMIT 0, 10

Мне было интересно, можно ли этого добиться с помощью какого-то подзапроса? Может быть, что-то вроде:

SELECT *, (SELECT * FROM Passenger WHERE Passenger.VehicleID = Vehicle.VehicleID LIMIT 0,50) FROM Vehicle LIMIT 0, 10

Но это не работает (подзапрос может возвращать только одну строку).

Заранее спасибо.


  • ПРИСОЕДИНЯЙТЕСЬ к вашему подзапросу 28.01.2016

Ответы:


1

В MySQL самый простой способ сделать то, что вы хотите, — это использовать переменные для перечисления строк:

SELECT * 
FROM (SELECT v.*, (@rnv := @rnv + 1) as seqnum_v
      FROM Vehicle v CROSS JOIN
           (SELECT @rnv := 0) params
     ) v LEFT JOIN
     (SELECT p.*,
             (@rnp := if(@v = VehicleId, @rnp + 1,
                         if(@v := VehicleId, 1, 1)
                        )
             ) as seqnum_p
      FROM Passenger p CROSS JOIN
           (SELECT @v := -1, @rnp := 0) params
     ) p
     ON p.VehicleID = v.VehicleID 
WHERE seqnum_v <= 10 and seqnum_p <= 50;
28.01.2016
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

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

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..