[PHP, MySQL] Wyszukiwarka autobusów

Witam, mam autobusy które kursują z przystanku A do B i z C do D. Wyszukiwanie takich połączeń nie stanowi problemu. Problemem staje się już jak chcę dojechać z A do D. Wtedy trzeba odszukać miejsce X które będzie miejscem przesiadki lub przesiadek. Niestety nie mam prostego sposobu który mi to w tym pomoże. Na samym początku chciałbym pokazać strukturę bazy danych:

--

-- Struktura tabeli dla `mzk_cms_accounts`

--


CREATE TABLE `mzk_cms_accounts` (

  `id` smallint(5) unsigned NOT NULL auto_increment,

  `login` varchar(30) collate utf8_polish_ci default NULL,

  `pass` char(32) collate utf8_polish_ci default NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `login` (`login`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=2 ;


-- --------------------------------------------------------


--

-- Struktura tabeli dla `mzk_cms_autobusy`

--


CREATE TABLE `mzk_cms_autobusy` (

  `id` smallint(5) unsigned NOT NULL auto_increment,

  `alias` varchar(100) collate utf8_polish_ci default NULL COMMENT 'unikalny alias autobusu',

  `nazwa` varchar(100) collate utf8_polish_ci default NULL COMMENT 'nazwa autobusu, np.: numer',

  `opis` text collate utf8_polish_ci COMMENT 'opis autobusu',

  PRIMARY KEY (`id`),

  UNIQUE KEY `UNIQUE` (`alias`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='Tabela z autobusami' AUTO_INCREMENT=26 ;


-- --------------------------------------------------------


--

-- Struktura tabeli dla `mzk_cms_godziny`

--


CREATE TABLE `mzk_cms_godziny` (

  `id` smallint(5) unsigned NOT NULL auto_increment,

  `oid` smallint(5) unsigned default '0' COMMENT 'id odjazdu',

  `pid` smallint(5) unsigned default '0' COMMENT 'id przystanku',

  `godzina` mediumint(8) unsigned default '0',

  `time` time NOT NULL,

  PRIMARY KEY (`id`),

  KEY `ODJAZDY` (`oid`),

  KEY `PRZYSTANKI` (`pid`),

  KEY `Godzina` (`godzina`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='godzina przyjazdu na przystanek' AUTO_INCREMENT=16031 ;


-- --------------------------------------------------------


--

-- Struktura tabeli dla `mzk_cms_kierunki`

--


CREATE TABLE `mzk_cms_kierunki` (

  `id` smallint(5) unsigned NOT NULL auto_increment,

  `alias` varchar(100) collate utf8_polish_ci default NULL COMMENT 'alias kursu',

  `nazwa` varchar(100) collate utf8_polish_ci default NULL COMMENT 'nazwa kursu',

  PRIMARY KEY (`id`),

  UNIQUE KEY `alias` (`alias`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='kierunki jazdy' AUTO_INCREMENT=30 ;


-- --------------------------------------------------------


--

-- Struktura tabeli dla `mzk_cms_kursy`

--


CREATE TABLE `mzk_cms_kursy` (

  `id` smallint(5) unsigned NOT NULL auto_increment,

  `aid` smallint(5) unsigned default '0' COMMENT 'id autobusu',

  `kid` smallint(5) unsigned default '0' COMMENT 'id kierunku',

  `przystanki` text collate utf8_polish_ci,

  `waznosc` timestamp NOT NULL default CURRENT_TIMESTAMP,

  PRIMARY KEY (`id`),

  KEY `AUTOBUSY` (`aid`),

  KEY `KIERUNKI` (`kid`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='kursy autobusów' AUTO_INCREMENT=50 ;


-- --------------------------------------------------------


--

-- Struktura tabeli dla `mzk_cms_legenda`

--


CREATE TABLE `mzk_cms_legenda` (

  `id` smallint(5) unsigned NOT NULL auto_increment,

  `skrot` varchar(5) collate utf8_polish_ci default NULL,

  `opis` text collate utf8_polish_ci,

  PRIMARY KEY (`id`),

  UNIQUE KEY `skrot` (`skrot`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=16 ;


-- --------------------------------------------------------


--

-- Struktura tabeli dla `mzk_cms_legenda_odjazdy`

--


CREATE TABLE `mzk_cms_legenda_odjazdy` (

  `id` smallint(5) unsigned NOT NULL auto_increment,

  `oid` smallint(5) unsigned default '0' COMMENT 'id odjazdu',

  `lid` smallint(5) unsigned default '0' COMMENT 'id skrótu w legendzie',

  PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1402 ;


-- --------------------------------------------------------


--

-- Struktura tabeli dla `mzk_cms_odjazdy`

--


CREATE TABLE `mzk_cms_odjazdy` (

  `id` smallint(5) unsigned NOT NULL auto_increment,

  `nazwa` varchar(100) collate utf8_polish_ci default NULL,

  `tid` smallint(5) unsigned default '0' COMMENT 'id trasy',

  `dni` set('1','2','3','4','5','6','7') collate utf8_polish_ci NOT NULL,

  PRIMARY KEY (`id`),

  KEY `TRASY` (`tid`),

  KEY `DNI` (`dni`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='Odjazdy autobusów' AUTO_INCREMENT=876 ;


-- --------------------------------------------------------


--

-- Struktura tabeli dla `mzk_cms_przystanki`

--


CREATE TABLE `mzk_cms_przystanki` (

  `id` smallint(5) unsigned NOT NULL auto_increment,

  `alias` varchar(100) collate utf8_polish_ci default NULL COMMENT 'lias przystanku',

  `nazwa` varchar(100) collate utf8_polish_ci default NULL COMMENT 'nazwa przystanku',

  `x` float unsigned default NULL COMMENT 'szerokość geograficzna przystanku',

  `y` float unsigned default NULL COMMENT 'długość geograficzna przystanku',

  PRIMARY KEY (`id`),

  UNIQUE KEY `UNIQUE` (`alias`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='przystanki autobusowe' AUTO_INCREMENT=235 ;


-- --------------------------------------------------------


--

-- Struktura tabeli dla `mzk_cms_settings`

--


CREATE TABLE `mzk_cms_settings` (

  `cmsTitle` text collate utf8_polish_ci NOT NULL,

  `cmsKeywords` text collate utf8_polish_ci NOT NULL,

  `cmsDescription` text collate utf8_polish_ci NOT NULL,

  `cmsURLPage` text collate utf8_polish_ci NOT NULL,

  `cmsTemplate` text collate utf8_polish_ci NOT NULL

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;


-- --------------------------------------------------------


--

-- Struktura tabeli dla `mzk_cms_trasy`

--


CREATE TABLE `mzk_cms_trasy` (

  `id` smallint(5) unsigned NOT NULL auto_increment,

  `kid` smallint(5) unsigned default '0' COMMENT 'id kursu',

  `przystanki` text collate utf8_polish_ci COMMENT 'przystanki przez które jeżdżą autobusy w formie |1|2|3|',

  PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='trasy, którymi jedzie autobus' AUTO_INCREMENT=237 ;

oraz przykładowe dane:

--

-- Zrzut danych tabeli `mzk_cms_accounts`

--


INSERT INTO `mzk_cms_accounts` (`id`, `login`, `pass`) VALUES

(1, 'admin', '21232f297a57a5a743894a0e4a801fc3');


--

-- Zrzut danych tabeli `mzk_cms_autobusy`

--


INSERT INTO `mzk_cms_autobusy` (`id`, `alias`, `nazwa`, `opis`) VALUES

(1, '4', '4', NULL),

(2, '7', '7', NULL),

(3, '2', '2', NULL),

(4, '8', '8', NULL),

(5, '46', '46', NULL)


--

-- Zrzut danych tabeli `mzk_cms_godziny`

--


INSERT INTO `mzk_cms_godziny` (`id`, `oid`, `pid`, `godzina`, `time`) VALUES

(1, 1, 6, 27000, '12:00:00'),

(2, 1, 8, 27120, '00:00:00'),

(3, 1, 9, 27180, '00:00:00'),

(4, 1, 10, 27240, '00:00:00'),

(5, 1, 11, 27360, '00:00:00')


--

-- Zrzut danych tabeli `mzk_cms_kierunki`

--


INSERT INTO `mzk_cms_kierunki` (`id`, `alias`, `nazwa`) VALUES

(1, 'os-zasole-ii-zasole-petla-stare-stawy-spolem', 'Os. Zasole II / Zasole Pętla / Stare Stawy / Społem'),

(2, 'zaklady-chemiczne-dworzec-fabryczny', 'Zakłady Chemiczne / Dworzec Fabryczny'),

(3, 'stare-stawy', 'Stare Stawy'),

(4, 'zaklady-chemiczne', 'Zakłady Chemiczne'),

(5, 'zaklady-chemiczne-dwory', 'Zakłady Chemiczne / Dwory')


--

-- Zrzut danych tabeli `mzk_cms_kursy`

--


INSERT INTO `mzk_cms_kursy` (`id`, `aid`, `kid`, `przystanki`, `waznosc`) VALUES

(1, 1, 1, '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27', '2011-08-20 15:40:42'),

(2, 1, 2, '23,22,21,20,19,18,17,16,15,28,14,29,30,12,11,10,9,8,7,6,5,31,4,3,2,1', '2011-08-20 16:52:42'),

(3, 2, 3, '16,32,14,29,33,22,23', '2011-08-21 09:01:14'),

(4, 2, 4, '6,5,34,35,33,22,23', '2011-08-21 09:02:47'),

(5, 3, 5, '16,17,18,19,21,22,23,22,33,35,34,5,6,36,7,37,38', '2011-08-21 09:37:29')

--

-- Zrzut danych tabeli `mzk_cms_legenda`

--


INSERT INTO `mzk_cms_legenda` (`id`, `skrot`, `opis`) VALUES

(1, 'x', 'kurs w dni robocze'),

(2, 'l', 'kursuje wyłącznie w dni nauki szkolnej'),

(3, 'z', 'kursuje w soboty'),

(4, '+', 'kursuje w niedziele'),

(5, 'm', 'nie kursuje 24.12')


--

-- Zrzut danych tabeli `mzk_cms_legenda_odjazdy`

--


INSERT INTO `mzk_cms_legenda_odjazdy` (`id`, `oid`, `lid`) VALUES

(1, 1, 1),

(2, 1, 2),

(3, 2, 1),

(4, 3, 3),

(5, 3, 4)


--

-- Zrzut danych tabeli `mzk_cms_odjazdy`

--


INSERT INTO `mzk_cms_odjazdy` (`id`, `nazwa`, `tid`, `dni`) VALUES

(1, NULL, 1, '1,2,3,4,5'),

(2, NULL, 1, '1,2,3,4,5'),

(3, NULL, 1, '6,7'),

(4, NULL, 1, '6'),

(5, NULL, 1, '7')


--

-- Zrzut danych tabeli `mzk_cms_przystanki`

--


INSERT INTO `mzk_cms_przystanki` (`id`, `alias`, `nazwa`, `x`, `y`) VALUES

(1, 'dworzec-fabryczny', 'Dworzec Fabryczny', NULL, NULL),

(2, 'gazy-techniczne', 'Gazy Techniczne', NULL, NULL),

(3, 'monowice', 'Monowice', NULL, NULL),

(4, 'brama', 'Brama', NULL, NULL),

(5, 'lodowisko', 'Lodowisko', NULL, NULL)


--

-- Zrzut danych tabeli `mzk_cms_settings`

--


INSERT INTO `mzk_cms_settings` (`cmsTitle`, `cmsKeywords`, `cmsDescription`, `cmsURLPage`, `cmsTemplate`) VALUES

('tytul', 'slowa', 'opis', 'http://domena.pl/', 'tpl');


--

-- Zrzut danych tabeli `mzk_cms_trasy`

--


INSERT INTO `mzk_cms_trasy` (`id`, `kid`, `przystanki`) VALUES

(1, 1, '|6|8|9|10|11|12|13|14|15|16|17|18|19|20|'),

(2, 1, '|6|8|9|10|11|12|13|14|15|16|24|25|26|27|'),

(3, 1, '|6|8|9|10|11|12|13|14|15|16|17|18|19|21|22|23|'),

(4, 1, '|1|2|3|4|5|6|8|9|10|11|12|13|14|15|16|17|18|19|20|'),

(5, 1, '|1|2|3|4|5|6|8|9|10|11|12|13|14|15|16|17|18|19|21|22|23|')

mam nadzieje, że to pomoże w weryfikacji bazy.

poproszę sugestie odnośnie tego wyszukiwania

Ja bym se zrobił tabelę w mysql dot najefektywniejszych połączeń. Np przystanek źródło, przystanek cel, godzina źródło, linie, czas przejazdu.

Oczywiście tworzysz to rekurencyjnie na zasadzie prób i błędów jadąc po wszystkich przystankach o danej godzinie do wszystkich celów a wynik zapisujesz do tabeli temp. Później eliminujesz wszystkie z takim samym źródłem i celem poza tym z najlepszym czasem dojazdu i dajesz go do właściwej tabeli. Oczywiście z góry musisz narzucić jakiś czas oczekiwania, ze względu na to iż nie zawsze bus przyjedzie o czasie :slight_smile:

Nie wiem, czy to najefektywniejsza metoda.