/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Problemer med join
Fra : SB


Dato : 19-01-08 21:40

Hejsa

Jeg har et problem med min inner join.

SELECT
`train_item_main`.`MainTitel`,
`tog_scale`.`s_scale`,
`train_item_main`.`MainId`
FROM
`train_item_main`
Inner Join `tog_scale_ref` ON `train_item_main`.`MainScaleID` =
`tog_scale_ref`.`sref_sid`
Inner Join `tog_scale` ON `tog_scale_ref`.`sref_id` = `tog_scale`.`s_id`


Giver resultatet: (Der skulle være 5!)


Lokomotiv rød   1:87   2
1234      1:87   5
Damper      1:87   6
MiniTrix loko   1:160   1
123456 mmm   1:160   3
Lokomotiv rød   1:22,5   2
1234      1:22,5   5
Damper      1:22,5   6
MiniTrix loko   1:22,5   1
123456 mmm   1:22,5   3
Lokomotiv rød   1:64   2
1234      1:64   5
Damper      1:64   6
MiniTrix loko   1:120   1
123456 mmm   1:120   3
Lokomotiv rød   1:220   2
1234      1:220   5
Damper      1:220   6


Hvorfor får jeg så mange resultater???


//Søren

 
 
Michael Zedeler (19-01-2008)
Kommentar
Fra : Michael Zedeler


Dato : 19-01-08 22:05

SB wrote:
> Jeg har et problem med min inner join.
>
> SELECT
> `train_item_main`.`MainTitel`,
> `tog_scale`.`s_scale`,
> `train_item_main`.`MainId`
> FROM
> `train_item_main`
> Inner Join `tog_scale_ref` ON `train_item_main`.`MainScaleID` =
> `tog_scale_ref`.`sref_sid`
> Inner Join `tog_scale` ON `tog_scale_ref`.`sref_id` = `tog_scale`.`s_id`
>
> Giver resultatet: (Der skulle være 5!) [klip]

Kan du ikke spole tilbage og forklare hvad det er, du gerne vil have
trukket ud? Bring tabellerne her sammen med det resultat, du forventer.

Mvh. Michael.

SB (19-01-2008)
Kommentar
Fra : SB


Dato : 19-01-08 22:12

Michael Zedeler skrev:
> SB wrote:
>> Jeg har et problem med min inner join.
>>
>> SELECT
>> `train_item_main`.`MainTitel`,
>> `tog_scale`.`s_scale`,
>> `train_item_main`.`MainId`
>> FROM
>> `train_item_main`
>> Inner Join `tog_scale_ref` ON `train_item_main`.`MainScaleID` =
>> `tog_scale_ref`.`sref_sid`
>> Inner Join `tog_scale` ON `tog_scale_ref`.`sref_id` = `tog_scale`.`s_id`
>>
>> Giver resultatet: (Der skulle være 5!) [klip]
>
> Kan du ikke spole tilbage og forklare hvad det er, du gerne vil have
> trukket ud? Bring tabellerne her sammen med det resultat, du forventer.
>
> Mvh. Michael.


Hejsa

Tror egentlig jeg er ved at have fundet løsningen - Manglede nogle WHERE
statements!

Så nu begynder det at se rigtigt ud!

//Søren

Gert Krabsen (19-01-2008)
Kommentar
Fra : Gert Krabsen


Dato : 19-01-08 22:24

SB skrev:
> Hejsa
>
> Jeg har et problem med min inner join.
>
> SELECT
> `train_item_main`.`MainTitel`,
> `tog_scale`.`s_scale`,
> `train_item_main`.`MainId`
> FROM
> `train_item_main`
> Inner Join `tog_scale_ref` ON `train_item_main`.`MainScaleID` =
> `tog_scale_ref`.`sref_sid`
> Inner Join `tog_scale` ON `tog_scale_ref`.`sref_id` = `tog_scale`.`s_id`
>
>
> Giver resultatet: (Der skulle være 5!)
>
>
> Lokomotiv rød 1:87 2
> 1234 1:87 5
> Damper 1:87 6
> MiniTrix loko 1:160 1
> 123456 mmm 1:160 3
> Lokomotiv rød 1:22,5 2
> 1234 1:22,5 5
> Damper 1:22,5 6
> MiniTrix loko 1:22,5 1
> 123456 mmm 1:22,5 3
> Lokomotiv rød 1:64 2
> 1234 1:64 5
> Damper 1:64 6
> MiniTrix loko 1:120 1
> 123456 mmm 1:120 3
> Lokomotiv rød 1:220 2
> 1234 1:220 5
> Damper 1:220 6
>
>
> Hvorfor får jeg så mange resultater???


Fordi du ikke har styr på relationerne mellem dine tabeller..

Nærmere kan man ikke komme uden at kende din tabelstruktur.
Det kunne jo tænkes at din sidste join mellem tog_scale og tog_scale_ref
resulterer i flere kombinationer, hvis nu join-felterne ikke er unikke i
nogen af tabellerne.
Hvad laver forresten tabellen tog_scale i din join, når du ikke bruger
den til noget?


At dømme ud fra SQL-teksten er du heller ikke særlig konsekvent i
navngivningen af felter ;-(
Det er noget rod, at et felt med samme indhold ikke har samme navn i to
tabeller. Eksempel:

train_item_main.MainScaleID = tog_scale_ref.sref_sid

her bør feltet i train_item_main have samme navn som det har i den
tabel, det referer til, så:

tog_scale_ref.tog_scale_ref_id
er et autonummereret felt med unikt index, d.v.s. kun een
post i tabellen tog_scale_ref må kunne have samme værdi.

train_item_main.tog_scale_ref_id
er et felt af typen long (lidt afhængig af databasefabrikat)
Det er et indekseret felt, hvor dubletter tillades (fordi
flere items kan have samme skala)

På den måde er man ikke i tvivl om, hvilke felter der kan bruges til joins.



mvh
Krabsen





SB (20-01-2008)
Kommentar
Fra : SB


Dato : 20-01-08 16:28


> Fordi du ikke har styr på relationerne mellem dine tabeller..
>
>
> train_item_main.MainScaleID = tog_scale_ref.sref_sid
>
> her bør feltet i train_item_main have samme navn som det har i den
> tabel, det referer til, så:
>
> tog_scale_ref.tog_scale_ref_id
> er et autonummereret felt med unikt index, d.v.s. kun een
> post i tabellen tog_scale_ref må kunne have samme værdi.
>
> train_item_main.tog_scale_ref_id
> er et felt af typen long (lidt afhængig af databasefabrikat)
> Det er et indekseret felt, hvor dubletter tillades (fordi
> flere items kan have samme skala)
>
> På den måde er man ikke i tvivl om, hvilke felter der kan bruges til joins.
>
>
>
> mvh
> Krabsen
>
Hejsa

Det er taget til efterretning! Vil nok lige kigge det hele igennem og
gøre det mere strømlinet

//Søren

SB (20-01-2008)
Kommentar
Fra : SB


Dato : 20-01-08 20:10

SB skrev:
>
>> Fordi du ikke har styr på relationerne mellem dine tabeller..
>>
>>
>> train_item_main.MainScaleID = tog_scale_ref.sref_sid
>>
>> her bør feltet i train_item_main have samme navn som det har i den
>> tabel, det referer til, så:
>>
>> tog_scale_ref.tog_scale_ref_id
>> er et autonummereret felt med unikt index, d.v.s. kun een
>> post i tabellen tog_scale_ref må kunne have samme værdi.
>>
>> train_item_main.tog_scale_ref_id
>> er et felt af typen long (lidt afhængig af databasefabrikat)
>> Det er et indekseret felt, hvor dubletter tillades (fordi
>> flere items kan have samme skala)
>>
>> På den måde er man ikke i tvivl om, hvilke felter der kan bruges til
>> joins.
>>
>>
>>
>> mvh
>> Krabsen
>>
> Hejsa
>
> Det er taget til efterretning! Vil nok lige kigge det hele igennem og
> gøre det mere strømlinet
>
> //Søren


I forlængelse af tidligere spørgsmål, er der nu opstået en anden
forhindring! Hvis en af værdierne i min inner join ikke er indtastet i
databasen, får jeg heller ikke resten af værdierne for denne record i
mit resultat!

Eks:

Inner Join `train_images_ref` ON `train_images_ref`.`fref_useritemid` =
`train_item_user`.`UserItemID`

Men hvis en UserItem ikke har et billede, og derfor heller ikke optræder
i train_images_ref, så får jeg ikke de andre data med - hvorfor ikke og
hvordan skal det løses?

//Søren - der har meget at lære endnu....

Gert Krabsen (20-01-2008)
Kommentar
Fra : Gert Krabsen


Dato : 20-01-08 21:33

SB skrev:
> SB skrev:
>>
>>> Fordi du ikke har styr på relationerne mellem dine tabeller..
>>>
>>>
>>> train_item_main.MainScaleID = tog_scale_ref.sref_sid
>>>
>>> her bør feltet i train_item_main have samme navn som det har i den
>>> tabel, det referer til, så:
>>>
>>> tog_scale_ref.tog_scale_ref_id
>>> er et autonummereret felt med unikt index, d.v.s. kun een
>>> post i tabellen tog_scale_ref må kunne have samme værdi.
>>>
>>> train_item_main.tog_scale_ref_id
>>> er et felt af typen long (lidt afhængig af databasefabrikat)
>>> Det er et indekseret felt, hvor dubletter tillades (fordi
>>> flere items kan have samme skala)
>>>
>>> På den måde er man ikke i tvivl om, hvilke felter der kan bruges til
>>> joins.
>>>
>>>
>>>
>>> mvh
>>> Krabsen
>>>
>> Hejsa
>>
>> Det er taget til efterretning! Vil nok lige kigge det hele igennem og
>> gøre det mere strømlinet
>>
>> //Søren
>
>
> I forlængelse af tidligere spørgsmål, er der nu opstået en anden
> forhindring! Hvis en af værdierne i min inner join ikke er indtastet i
> databasen, får jeg heller ikke resten af værdierne for denne record i
> mit resultat!
>
> Eks:
>
> Inner Join `train_images_ref` ON `train_images_ref`.`fref_useritemid` =
> `train_item_user`.`UserItemID`
>
> Men hvis en UserItem ikke har et billede, og derfor heller ikke optræder
> i train_images_ref, så får jeg ikke de andre data med - hvorfor ikke og
> hvordan skal det løses?

Formentlig ved at skifte til LEFT JOIN.

Et tip, hvis du er ny i databaser (og nu får jeg sikkert en masse
database-bedrevidende på nakken, men dem om det..):

Har du Microsoft Access installeret? Så opbyg dine tabeller der og lav
forespørgslerne i Access med al den grafiske hjælp, der til rådighed.
F.eks. ved at højreklikke på en join kan du bestemme hvordan den skal
reagere, hvis der ikke er records i begge tabeller - så finder den ud
af, om du skal bruge inner, left eller right join)..

Når det virker, viser du forespørgslen som sql og kan klippe den over
til det system, du nu en gang arbejder på.

(Er det mySql, så køb MyDBDump fra Softguru.net så kan du flytte hele
databaser med data, forespørgsler og det hele mellem Access og mySql let
og smertefrit)










SB (20-01-2008)
Kommentar
Fra : SB


Dato : 20-01-08 22:24

Gert Krabsen skrev:
> SB skrev:
>> SB skrev:
>>>
>>>> Fordi du ikke har styr på relationerne mellem dine tabeller..
>>>>
>>>>
>>>> train_item_main.MainScaleID = tog_scale_ref.sref_sid
>>>>
>>>> her bør feltet i train_item_main have samme navn som det har i den
>>>> tabel, det referer til, så:
>>>>
>>>> tog_scale_ref.tog_scale_ref_id
>>>> er et autonummereret felt med unikt index, d.v.s. kun een
>>>> post i tabellen tog_scale_ref må kunne have samme værdi.
>>>>
>>>> train_item_main.tog_scale_ref_id
>>>> er et felt af typen long (lidt afhængig af databasefabrikat)
>>>> Det er et indekseret felt, hvor dubletter tillades (fordi
>>>> flere items kan have samme skala)
>>>>
>>>> På den måde er man ikke i tvivl om, hvilke felter der kan bruges til
>>>> joins.
>>>>
>>>>
>>>>
>>>> mvh
>>>> Krabsen
>>>>
>>> Hejsa
>>>
>>> Det er taget til efterretning! Vil nok lige kigge det hele igennem og
>>> gøre det mere strømlinet
>>>
>>> //Søren
>>
>>
>> I forlængelse af tidligere spørgsmål, er der nu opstået en anden
>> forhindring! Hvis en af værdierne i min inner join ikke er indtastet i
>> databasen, får jeg heller ikke resten af værdierne for denne record i
>> mit resultat!
>>
>> Eks:
>>
>> Inner Join `train_images_ref` ON `train_images_ref`.`fref_useritemid`
>> = `train_item_user`.`UserItemID`
>>
>> Men hvis en UserItem ikke har et billede, og derfor heller ikke
>> optræder i train_images_ref, så får jeg ikke de andre data med -
>> hvorfor ikke og hvordan skal det løses?
>
> Formentlig ved at skifte til LEFT JOIN.
>
> Et tip, hvis du er ny i databaser (og nu får jeg sikkert en masse
> database-bedrevidende på nakken, men dem om det..):
>
> Har du Microsoft Access installeret? Så opbyg dine tabeller der og lav
> forespørgslerne i Access med al den grafiske hjælp, der til rådighed.
> F.eks. ved at højreklikke på en join kan du bestemme hvordan den skal
> reagere, hvis der ikke er records i begge tabeller - så finder den ud
> af, om du skal bruge inner, left eller right join)..
>
> Når det virker, viser du forespørgslen som sql og kan klippe den over
> til det system, du nu en gang arbejder på.
>
> (Er det mySql, så køb MyDBDump fra Softguru.net så kan du flytte hele
> databaser med data, forespørgsler og det hele mellem Access og mySql let
> og smertefrit)
>

OK - jeg prøver med left.... Jeg bruger Mysql på en WAMP server
(http://www.wampserver.com/en/) - og NaviCat (http://www.navicat.com)
med grafisk Query Builder - men al begyndelse er svær

//Søren

Søg
Reklame
Statistik
Spørgsmål : 177578
Tips : 31968
Nyheder : 719565
Indlæg : 6409072
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste