16. januar 2009 - 13:02Der er
8 kommentarer og 1 løsning
hvorfor virker min join ikke?
Jeg har 3 tables:
Byer rummer 'ByNavn','LandID','RegionID' Lande rummer 'LandNavn','LandID' Regioner rummer 'RegionNavn','LandID'
Jeg vil gerne søge på en by, fx Berlin, og så have en resultat der siger
Berlin, Germany (Berlin) Berlin, USA, (MD) Berlin, USA, (CT) .. etc
Det jeg forsøger med nu er:
SELECT `City` , `Country` , `Region` FROM ((Cities INNER JOIN Countries ON Cities.CountryID = Countries.CountryID) INNER JOIN Regions ON Countries.CountryID = Regions.CountryID)
WHERE `City` LIKE 'Berlin'
serveren siger "You have an error in your SQL syntax"
Byer rummer 'City','RegionID','CountryID' Regioner rummer 'Region','CountryID' Lande rummer 'Country','CountryID'
Jeg vil gerne søge på en by, fx Berlin, og så have en resultat der siger
Berlin, Germany (Berlin) Berlin, USA, (MD) Berlin, USA, (CT) .. etc
Det jeg forsøger med nu er:
SELECT `City` , `Country` , `Region` FROM ((Cities INNER JOIN Countries ON Cities.CountryID = Countries.CountryID) INNER JOIN Regions ON Countries.CountryID = Regions.CountryID)
Cities rummer 'City','RegionID','CountryID' Regions rummer 'Region','CountryID' Countries rummer 'Country','CountryID'
Jeg vil gerne søge på en by, fx Berlin, og så have en resultat der siger
Berlin, Germany (Berlin) Berlin, USA, (MD) Berlin, USA, (CT) .. etc
Det jeg forsøger med nu er:
SELECT `City` , `Country` , `Region` FROM ((Cities INNER JOIN Countries ON Cities.CountryID = Countries.CountryID) INNER JOIN Regions ON Countries.CountryID = Regions.CountryID)
Med den select du har angivet, får du også en fejl der, eller bare de forkert data??
Jeg vil mene den skulle virke, men vil give forkert værdier (for mange resultater). Det skyldes din join på Countries til Regions. Der burde slet ikke værer noget countryID på byen. Den burde gå gennem regioner. Altså sådan:
Cities rummer 'ID', 'City','RegionID' Regions rummer 'ID', 'Region','CountryID' Countries rummer 'ID', 'Country'
select ci.city, re.Region, co.Country from Cities ci inner join Regions re on re.id=ci.RegionID inner join Countries co on co.id=re.CountryID
fennec tak for svarene, men jeg tror ikke min sql forståelse er helt tilstrækkelig, så jeg vil lige prøve at omformulere spørgsmået, og gøre det mere åbent.
hvordan kan jeg konstruere en query der leverer følgende, på den hurtigst eksekverbare måde?
jeg har en tabel 'cities', en tabel 'regions' og en tabel 'countries' hver tabel rummer navnene på hhv byer, regioner og lande, samt relationelle id'er
dvs cities rummer bynavn,cityID,regionID,CountryID regions rummer regionnavn,regionID,CountryID countries rummer countrynavn,CountryID
Jeg ønsker at kunne søge på et bynavn eller dele af et bynavn, og få returneret en liste over alle matchende byer, men med tilhørende regionnavn og landenavn i stedet for de regionID'er og landeID'er jeg som udgangspunkt for ud af forespøgslen.
en søgnig på 'Berlin' skal altså returnere et antal byer med navnet Berlin, og med navnene på de tilhørende lande og regioner hvor de respektive byer ligger.
Tabellen cities rummer 50.000 records, regions 4.000 og countries 300. jeg ønsker at eksekveringen er optimeret mht. den tid det tager at returnere resultatet.
jeg kan finde ud af at løse problemet ved at køre 3 separate queries, hvor jeg sammensætter et array af bynavne, regioner og lande, men jeg forestiller mig det er mere optimalt at lade dete foregå som del af sql forespørgslen via en form for JOIN statement.
mit spørgsmål er nu, hvordan skal den statement se ud?
SELECT Cities.City, Countries.Country, Regions.Region FROM swap_db.Cities Cities, swap_db.Countries Countries, swap_db.Regions Regions WHERE Cities.CountryID = Countries.CountryId AND Cities.CountryID = Regions.CountryID AND Cities.City LIKE 'Berlin'
Du kom jo med det korrekte svar 19/01-2009 12:52:11, ved ikke hvorfor jeg ikke forstod det i første omgang.. nu virker det fint, og lyset er endelig gået op for mig mht at forstå join. tak..
dette er min fungerende version.
SELECT ci.City, re.Region, co.Country FROM Cities ci JOIN Regions re ON re.Regionid = ci.Regionid JOIN Countries co ON co.CountryID = ci.CountryID WHERE ci.City LIKE 'Ber%'
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.