Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z zapytaniem oraz struktura tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
netwalker2000
witam,

Ciężko mi jest sformułować z czym mam problem więc postaram się opisowo smile.gif

Jest baza z 10 tabelami. Wśród nich znajduja się tabele :

countries #panstwa

  1. CREATE TABLE IF NOT EXISTS `baza`.`countries` (
  2. `country_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'ID of Country' ,
  3. `country_code` VARCHAR(3) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL COMMENT 'ISO Country Code' ,
  4. `name_pl` VARCHAR(40) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL COMMENT 'Polish translation' ,
  5. `name_de` VARCHAR(40) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL COMMENT 'German translation' ,
  6. `name_en` VARCHAR(40) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL COMMENT 'English translation' ,
  7. PRIMARY KEY (`country_id`) ,
  8. UNIQUE INDEX `country_code` (`country_code` ASC) )
  9. ENGINE = MyISAM
  10. AUTO_INCREMENT = 29
  11. DEFAULT CHARACTER SET = latin2


cities #miasta

  1. CREATE TABLE IF NOT EXISTS `baza`.`cities` (
  2. `city_id` INT(11) NOT NULL AUTO_INCREMENT ,
  3. `name` VARCHAR(20) NOT NULL ,
  4. `language_id` INT(11) NOT NULL ,
  5. `country_id` INT(11) NOT NULL ,
  6. `region_id` INT(11) NOT NULL ,
  7. PRIMARY KEY (`city_id`) ,
  8. UNIQUE INDEX `name` (`name` ASC) ,
  9. INDEX `country_id` (`country_id` ASC) ,
  10. INDEX `region_id` (`region_id` ASC) ,
  11. INDEX `language_id` (`language_id` ASC) )
  12. ENGINE = MyISAM
  13. AUTO_INCREMENT = 1087
  14. DEFAULT CHARACTER SET = latin2


To co chciałbym osignac to dane w postaci relacji między miastami w poszczególnych państwac tzn.
chodzi konkretnie o połczenie komunikacyjne spełniajace takie warunki:
każde miasto z polski jest połaczone z kazdym miastem w kazdym panstwie oprócz polski
każde miasto w każdym państwie (oprócz polski) jest połaczone tylko z polska

Nie wiem czy powinno to być zapytanie do takiej struktury i za kazdym razem generowane dynamicznie, czy powinienem stworzyć widok połaczonych tabel? a moze powinienem stworzyc osobna tabele i wypełnic ja poprzez jakis sktypt php, no nie wiem jak mam ten temat ugryźć smile.gif

To co chciałbym z tych danych otrzymac już po wyciagnieciu i formatowaniu to np.:
id 1 Warszawa - Berlin (Polska - Niemcy)
id 2 Warszawa - Amsterdam (Polska - Holandia)

ale np.
id n Warszawa - Gdańsk ( Polska - Polska) albo
id n Berlin - Amsterdam (Niemcy - Holandia) tego juz nie chce i to ma być wycięte z wyniku.

Wydaje mi sie że chyba bede musiał zrobić tabele połczeń i je ręcznie albo półautomatycznie potworzyć :/
Noidea
Utwórz sobie osobną tabelę połączenia z dwoma kolumnami (city_id_1, city_id_2). Możesz ją uzupełnić nawet zwykłym zapytaniem (poszukaj informacji o "INSERT SELECT")

Zapytanie pobierające pary miast, w których pierwsze jest z polski a drugie nie:
  1. SELECT c1.city_id, c2.city_id
  2. FROM cities c1
  3. JOIN cities c2 ON ( c2.country_id != 1234 )
  4. WHERE c2.country_id = 1234

gdzie 1234 to ID Polski
netwalker2000
Do nowej tabeli i jej wypełniania jeszcze nie doszedłem, natomiast jest progres smile.gif
Wypróbowałem poniższe zapytanie ale coś jeszcze nie bangla - troche je przerobiłem i dostaje juz wyniki

  1. SELECT c1.city_id, c1.name AS `z` , c2.city_id, c2.name AS `do`
  2. FROM cities c1
  3. JOIN cities c2 ON ( c2.country_id !=1 )
  4. WHERE c2.country_id =28
  5. AND c1.country_id =1


różnice:
id polski czyli 1234 u mnie ma wartość 1
w WHERE c2.country_id =28 ID polski nie zwraca wyników wiec zamieniłem na kraj docelowy
i dodałem AND c1.country_id =1
zmiany w SELECT to już dla sprawdzenia na nazwach czy działa

po tych zmianach dostaje wyniki zaweżone do państw ustwionych w WHERE

natomiast używajac takiego zapytania:
  1. SELECT c1.city_id, c1.name AS `z` , c2.city_id, c2.name AS `do`
  2. FROM cities c1
  3. JOIN cities c2 ON ( c2.country_id !=1 )
  4. WHERE c1.country_id =1


dostaje chyba to o co mi chodziło, jeszcze muszę to trochę dopracować
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.