Avatar billede simoom Nybegynder
13. august 2006 - 18:51 Der er 18 kommentarer og
1 løsning

join af to tabeller, hvor ikke alle rækker fra a er i b

Jeg er vandt til at kunne lave minus til at fjerne del mænger mellem to selects, eller bruge (+) til at sikre mig at jeg får alt med hvis bare det er i den ene tabel.

Derfor skrev jeg straks følgende select:

select a.genus, a.species, b.filnavn_small from species a, foto b
where a.species=b.species(+)
and a.genus=b.genus(+)

Det virkede bare ikke, så jeg prøvede istedet dette:

select a.genus, a.species, b.filnavn_small from species a, foto b
where a.species=b.species
and a.genus=b.genus
union
select genus, species, 'null' from
(select a.genus, a.species from species a
minus
select genus, species from foto)

Men det vikede heller ikke.

Den ene tabel indeholder arts information for en række planter. foto tabellen indeholder så information om evt billeder. Men der er bare ikke billeder til hver plante...

Nogen ideer til hvordan dette kan gøres i mysql? Altså hvordan bruges (+)?
Avatar billede erikjacobsen Ekspert
13. august 2006 - 18:56 #1
en LEFT JOIN måske
Avatar billede simoom Nybegynder
13. august 2006 - 22:35 #2
Selvfølgelig - dumb me. Tak :) Kan man virkelig ikke lave en not in/minus i mysql? Læg et svar og jeg slipper af med pointene.
Avatar billede erikjacobsen Ekspert
13. august 2006 - 22:51 #3
I en passende ny mysql kan du god lave en "NOT IN" - men ikke med den notation.
Jeg samler ikke på point, tak. Svar selv, accepter eget svar.
Avatar billede simoom Nybegynder
13. august 2006 - 23:23 #4
Meget nobelt, point er også ret ligegyldige.

Men jeg har stadigvæk problemer:

select a.genus, a.species, min(b.filnavn_small)
from species a left join foto b
on a.genus=b.genus
and a.species=b.species
where a.genus='Epidendrum'
and a.species like '%'
group by a.genus, b.species
order by species

hvilket giver mig syvrækker, men en række mangler (species='vesicatum'). Ændrer jeg så koden til denne:
select a.genus, a.species, min(b.filnavn_small)
from species a left join foto b
on a.genus=b.genus
and a.species=b.species
where a.genus='Epidendrum'
and a.species like 'vesicatum'
group by a.genus, b.species
order by species

Så kan jeg fange den manglende række, men får så selvfølgelig ikke de øvrige rækker med.

Har jeg igen lavet en dum overseelse?

Måske jeg bare skal sove på det...
Avatar billede simoom Nybegynder
13. august 2006 - 23:25 #5
Har lige testet lidt og fejlen kommer af bruge af min. Men for en del planter er der mere end et billed og så ønsker jeg kun at bruge det "laveste" billed.... nogen tips til dette?
Avatar billede erikjacobsen Ekspert
13. august 2006 - 23:39 #6
Den skal jeg lige tænke over. Men hvad giver

select a.genus, a.species, min(b.filnavn_small)
from species a left join foto b
on a.genus=b.genus
and a.species=b.species
where a.genus='Epidendrum'
group by a.genus, b.species
order by species

(en fjernet linie: and a.species like '%')
Avatar billede erikjacobsen Ekspert
13. august 2006 - 23:42 #7
Er der, i dit eksempel, ingen billeder svarende til 'vesicatum'  ?
Avatar billede simoom Nybegynder
13. august 2006 - 23:45 #8
Prøvede at tilføje en nvl rundt om b.filnavn_small, tænkte at det ville virkede bedre hvis jeg ikke havde null værdier i det felt jeg laver en min på, men det kan jeg heller ikke... syntes ikke jeg kan ret meget af det jeg plejer at kunne i sql.
Avatar billede erikjacobsen Ekspert
13. august 2006 - 23:47 #9
Hvis du kommer fra Oracle, så er der nok lidt tilvænning ;)  Men prisen er jo også en anden.
min på null-værdier plejer nu at give (en slags) mening
Avatar billede simoom Nybegynder
13. august 2006 - 23:49 #10
Nej der er ingen billeder for vesicatum...

Kører jeg dette select:
SELECT a.genus, a.species, b.filnavn_small
FROM species a
LEFT JOIN foto b ON a.genus = b.genus
AND a.species = b.species
WHERE a.genus = 'Epidendrum'
ORDER BY species

Får jeg disse rækker ud:
genus species filnavn_small
Epidendrum cristatum Epidendrum_cristatum.jpg
Epidendrum falcatum Epidendrum_falcatum.jpg
Epidendrum ilense Epidendrum_ilense_2.jpg
Epidendrum ilense Epidendrum_ilense.jpg
Epidendrum imatophyllum NULL
Epidendrum mojambee Epidendrum_mojambee.jpg
Epidendrum pseudepidendrum Epidendrum_pseudepidendrum.jpg
Epidendrum purum Epidendrum_purum.jpg
Epidendrum vesicatum NULL

At komme et min rundt om filnavnet går godt for imatophyllum, men smider vesicatum rækken ud, måske fordi den står tilsidst og har en null værdi...  men nvl vil ikke virker, måske jeg husker syntaxen forkert... nvl(filnavn_small,'na') burde da virke.

Mange tak for din tid. Man føler virkelig man render hovedet imod en mur når man er lidt ny til mysql og har en ide om at det man gerne vil burde kunne lade sig gøre... men at man bare gør et eller andet galt.

mvh/ Karen
Avatar billede simoom Nybegynder
13. august 2006 - 23:54 #11
Ja jeg er toad (oracle bruger), det var åbentbart let at spotte. Savner også lidt rollback funktionen fra toad, og backup er jo kun for tøsedrenge :)
Avatar billede erikjacobsen Ekspert
14. august 2006 - 00:00 #12
Jeg tror ikke jeg har kræfter til at hjælpe helt til dørs med orkideerne i aften. Men der er et lille 'hack' man kan bruge i netop mysql. Brug group by som i dit første eksempel, men lad være med at bruge 'min(...)' - du skal bare bruge feltnavnet. mysql vælger så en "tilfældig".
Avatar billede erikjacobsen Ekspert
14. august 2006 - 00:03 #13
Og så kan det nok være lidt usundt at skrive
    group by a.genus, b.species
når der nu ikke altid kommer noget fra b-tabellen. Prøv i stedet for
    group by a.genus, a.species
Det er vist der muldvarpen er begravet ;)
Avatar billede erikjacobsen Ekspert
14. august 2006 - 00:07 #14
Og der er sådan set ret stor forskel på Oracle og MySql. Uden at kende ret meget til Oracle, så er det min opfattelse at Oracle har en masse dejlige og praktiske funktioner som udvidelser til SQL, hvor MySql er tættere på hvad man kunne kalde en slags standard SQL. Kun tæt på ;)

Læs videre på http://dev.mysql.com/doc/refman/5.1/en/index.html  (og læg iøvrigt mærke til din mysql-version)
Avatar billede simoom Nybegynder
14. august 2006 - 00:08 #15
Du skal have tak for din indsats, tror også jeg selv burde stoppe, men man bliver jo lidt stædig... group by uden min virker dog ikke umiddelbart, men orkideerne løber jo ingen steder.
Avatar billede simoom Nybegynder
14. august 2006 - 00:11 #16
1000 tak, tænk at det var et lille b. - der sov jeg vist i time. Selectet virker fint nu.... suk hvor dumt

Jeg bruger surftown, så det er en gammel mysql version.

Nu kan jeg få sluttet denne lille opgave af, det skal bare pakkes ind i php...  mange tak, sikker på du stadigvæk ikke vil modtage pointene, du har mere end fortjent dem.
Avatar billede erikjacobsen Ekspert
14. august 2006 - 00:11 #17
Prøv lige forslaget fra 00:03:26
Avatar billede erikjacobsen Ekspert
14. august 2006 - 00:12 #18
Ok. fint nok. Nej tak, ingen point.
Avatar billede simoom Nybegynder
14. august 2006 - 00:16 #19
lukker og godt nat til natteravnene
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