Avatar billede mikkelbreum Nybegynder
16. januar 2009 - 13:02 Der 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"
Avatar billede fennec Nybegynder
16. januar 2009 - 13:04 #1
Jeg vil gætte på det er fordi kolonnerne hedder LandID og ikke CountryID
Avatar billede fennec Nybegynder
16. januar 2009 - 13:05 #2
Ved ikke om du er helt galt i byen, men din DB beskrivelse stemmer overhoved ikke ens med din select...
Avatar billede mikkelbreum Nybegynder
16. januar 2009 - 13:36 #3
sorry her har vi den:

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)

WHERE `City` LIKE 'Berlin'
Avatar billede mikkelbreum Nybegynder
16. januar 2009 - 13:37 #4
om igen

sorry her har vi den:

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)

WHERE `City` LIKE 'Berlin'
Avatar billede fennec Nybegynder
19. januar 2009 - 12:52 #5
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
Avatar billede mikkelbreum Nybegynder
19. januar 2009 - 13:48 #6
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?
Avatar billede mikkelbreum Nybegynder
19. januar 2009 - 14:49 #7
nu fandt jeg frem til en løsning:

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'
Avatar billede mikkelbreum Nybegynder
20. januar 2009 - 15:08 #8
fennec, vil du have point så opret et svar.

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%'
Avatar billede fennec Nybegynder
20. januar 2009 - 15:24 #9
.o) <-- One Eyed Jack
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester