2014-12-28 2 views
-2

у меня есть три таблицы и атрибуты в скобках:Запрос на столы план поездки

  • маршрут (route_id, ROUTE_NAME)
  • routestop (route_id, stop_id)
  • остановки (stop_id, stop_name)

route_id и stop_id в Routestop являются внешними ключами, ссылающимися на первичные ключи в маршруте и останавливаются соответственно. Теперь заданное stop_name может падать на несколько маршрутов и сказать, что я запрашиваю из формы, содержащей поле from_name_name и a в поле stop_name, как я могу получить результаты с указанием имен маршрутов и стоп-имен на основе входных параметров, которые я запрашиваю.

Благодаря

Я попытаюсь перефразировать. Я работаю над приложением планировщика поездок, в котором я хочу, чтобы пригородный оператор вводил два параметра в форме, содержащей FROM (имя остановки stop_name) и TO (конечное стоп-имя), например. из (Нью-Йорк) в (Буффало). Основываясь на таблице информации в моем вопросе, я хочу, чтобы пригородный дом получал результаты, предполагая, что может быть более одного маршрута, чтобы добраться до места назначения. Надеюсь, это поможет.

+0

Я не понимаю вообще. – Strawberry

+0

В чем вопрос? Вам не кажется, что лучше выполнить некоторые фрагменты запроса, чтобы лучше понять? – QMaster

ответ

0

Если я правильно вас понимаю, этот тип запроса, который вы ищете, называется «set-in-sets».

Один из способов приблизиться к нему - использовать агрегацию GROUP BY (по маршруту в вашем случае) и проверить условия (убедитесь, что обе остановки находятся в пути) в пункте HAVING.

Предполагая, что вы получите stop_id с в коде клиента (например, происхождение stop_id является 1 и назначение stop_id является 3), и если вы заинтересованы только в маршрутах информации Вашего запрос может выглядеть

SELECT r.* 
    FROM route_stop rs JOIN routes r 
    ON rs.route_id = r.route_id 
WHERE rs.stop_id IN(1,3) 
GROUP BY rs.route_id 
HAVING MAX(rs.stop_id = 1) + 
     MAX(rs.stop_id = 3) = 2 -- both stop_ids should be present for each route 

выхода образца :

 
| ROUTE_ID | ROUTE_NAME | 
|----------|------------| 
|  1 |  route1 | 
|  2 |  route2 | 

Вот SQLFiddle демо

I е вы хотите увидеть маршруты и все остановки выходного

SELECT r.*, GROUP_CONCAT(s.stop_name) stops 
    FROM 
(
    SELECT route_id 
    FROM route_stop 
    WHERE stop_id IN(1,3) 
    GROUP BY route_id 
    HAVING MAX(stop_id = 1) + 
     MAX(stop_id = 3) = 2 
) q JOIN route_stop rs 
    ON q.route_id = rs.route_id JOIN routes r 
    ON rs.route_id = r.route_id JOIN stops s 
    ON rs.stop_id = s.stop_id 
GROUP BY rs.route_id 

Пример:

 
| ROUTE_ID | ROUTE_NAME |    STOPS | 
|----------|------------|-------------------| 
|  1 |  route1 | stop5,stop3,stop1 | 
|  2 |  route2 | stop1,stop3,stop2 | 

Вот SQLFiddle демо

+0

Он работал как шарм! спасибо amillion peterm. Будете ли вы любезны сослаться на хорошую книгу mysql, учебник или сайт, чтобы улучшить мои навыки в этой конкретной области? –

+0

Вы очень желанны. Например. [Ошибки SQL: устранение ошибок программирования баз данных] (https://pragprog.com/book/bksqla/sql-antipatterns) Билла Карвина и [SQL Performance Explained] (http://sql-performance-explained.com) Маркус Винанд – peterm

Смежные вопросы