13. august 2006 - 18:51Der 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 (+)?
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 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?
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
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.
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.
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".
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 ;)
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å ;)
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.
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.
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.