Запрос Mysql для пар взаимосвязанных станций

Приветствую всех!

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

У меня есть стол со станциями:

stationID
lineID

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

  1. , если у них одинаковый идентификатор линии (т. е. они напрямую связаны)
  2. , если линии пересекаются (линии пересекаются, если у них есть общие станции).

Как мне это сделать? Заранее благодарю за ваш вклад и идеи!

0
nl ja de
Я не понимаю второго требования: как линии могут пересекаться, если каждая станция может быть связана только с одной строкой?
добавлено автор Ken Keenan, источник
Я никогда не говорил, что каждая станция может быть связана с одной строкой. Станции могут повторяться столько раз, сколько необходимо с помощью разных идентификаторов линии.
добавлено автор Skip_, источник
Я немного отредактирую вопрос, я вижу, как это может показаться запутанным.
добавлено автор Skip_, источник

2 ответы

Не сохраняйте lineID в таблице station . Вместо этого используйте три таблицы: station , line и station_line . Третья таблица объединяет станции с линиями, что дает возможность станции, имеющей нуль, одну или несколько линий.

station:
  ID
  name

line:
  ID
  name

station_line:
  station
  line
0
добавлено
Том, спасибо. Я действительно упростил многое в своем вопросе, чтобы не казаться слишком запутанным. Станции хранятся в отдельной таблице вместе со всеми данными станции. Строки также хранятся в другой таблице с информацией об услуге. В таблице, о которой я говорю, есть stationID, lineID, stationIdex (consequtive number of station на этой конкретной строке).
добавлено автор Skip_, источник

Проверьте это ( SQLFiddle ):

select distinct a.stationName as 'st1', b.stationName as 'st2', a.lineId from 
tbl as a, tbl as b where 
(a.lineId in (select lineId from tbl where stationId in 
              (select stationId from tbl where lineId=b.lineId)) && 
 a.stationId<>b.stationId) ;
0
добавлено
Проверьте скрипт, я обновил запрос. Но это не идеальное решение. Было бы лучше, если бы вы нормализировали свою таблицу, чтобы она стала легкой во время запроса.
добавлено автор Meherzad, источник
Мехерзад, спасибо, оцените это! Этот запрос помогает связать станции, которые находятся на одной линии (случай 1). Это была более легкая часть вопроса. Я не думаю, что это связывает станции, которые находятся на разных почти пересекающихся линиях (случай 2). Это тот, с которым я, похоже, больше всего беспокоюсь.
добавлено автор Skip_, источник
Хм ... теперь, это интересно! Я хочу поиграть с этим решением немного больше, но выглядит многообещающим и движется в правильном направлении! Также нужно будет увидеть, как сильно он может попасть на большой стол. Большое спасибо, оцените вашу помощь!
добавлено автор Skip_, источник
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw