Предполагая, что ваши поездки не «один офф», но вместо этого проводятся по заранее определенным линиям (и одна линия может генерировать несколько поездок), то вам нужно что-то вроде этого:
(. Если они являются один-офф, только представьте себе линия поездка)
Обратите внимание на структуру Ножка:
- Его PK содержит LEG_NO, но не содержит STOP_ID: LEG_NO определяет порядок ног в данной строке, а также позволяет нескольким ногам проходить по одной и той же остановке, если необходимо (например, в оба конца).
- Кроме того, в ноге есть только «старт» (а не «окончание») - что бы ни было «предыдущим» (как определено LEG_NO), нога определяет начальную остановку для следующего этапа. Таким образом, у вас никогда не может быть отключенных ножек (т. Е. Когда конечная остановка предыдущего этапа не соответствует стартовой остановке следующей ноги).
Рк TRIP содержит trip_no вместо (к примеру) START_DATE_TIME, чтобы несколько поездок, чтобы быть запущен на той же линии, в то же время, если вы когда-нибудь нужно.
23-й поездки на вашем примере «Восточное побережье Roadtrip» линия может быть представлена следующим образом:
TRIP: LINE_ID TRIP_NO
------- -------
100 23
LINE: LINE_ID LINE_NAME
------- ---------
100 'East coast roadtrip'
LEG: LINE_ID LEG_NO STOP_ID
------- ------ -------
100 1 55
100 2 11
100 3 66
100 4 22
100 5 44
100 6 33
STOP: STOP_ID STOP_NAME
------- ---------
22 'Baltimore'
11 'NYC'
33 'Raleigh'
66 'Philly'
55 'Boston'
44 'DC'
(Примечание: я намеренно использовал непоследовательных номера для телесного из соединений более четко .)
С помощью этой структуры базы данных, вы можете легко получить поездки, которые прошли через все заданные упоры, например:
SELECT *
FROM TRIP
WHERE
LINE_ID IN (
SELECT LINE_ID
FROM LEG JOIN STOP ON LEG.STOP_ID = STOP.STOP_ID
WHERE STOP_NAME IN ('NYC', 'Philly', 'Baltimore')
GROUP BY LINE_ID
HAVING COUNT(DISTINCT STOP_ID) = 3
)
(Примечание: На старых версиях MySQL, вы хотите переписать этот запрос как JOIN из-за проблемы, оптимизатор запросов имели с IN.)
Однако, если вы хотите, чтобы поездки, которые пошли через эти остановки в таком порядке и без «промежутков» между ними бедра становятся волосатыми в спешке. Вероятно, лучше всего получить результаты вышеприведенного запроса и проанализировать их на стороне клиента, вместо того, чтобы пытаться установить порядок и обнаружить пробелы в SQL (который основывается на принципе).
Хорошая работа, связанная с проблемой 1-> 2 и 2-> 3, не связана непосредственно. И диаграмма тоже! +1 – halfer
Спасибо, Бранко, я очень ценю то время, которое вы взяли, чтобы войти в такие подробности! – r3su