FunkyMonk Skrevet 29. mars 2007 Del Skrevet 29. mars 2007 Hvordan kan man på en elegant måte benytte kontrollstrukturer i en mySQL spørring? La oss si at jeg har 2 tabeller. I tabell 1 (Package) ligger endel data lagret direkte og med en fremmednøkkel til en tabell 2 (Person). Tabell 1 har også et felt fkey, som kan være enten true eller false. Er den true, skal man benytte fremmednøkkel og verdiene fra "fremmednøkkeltabellen". Er den false, er det verdiene som ligger direkte i tabell 1 som skal benyttes. Det skal bare kjøres 1 spørring. Package (id, fkey, pid, name, address, zip, city, country, email) Person (id, fname, lname, street1, zip, placename, country, email) SELECT id, state, shipment, CASE fkey WHEN 'true' THEN CONCAT_WS(' ', person.fname, person.lname) ELSE package.name END AS name CASE fkey WHEN 'true' THEN person.street1 ELSE package.address END AS address CASE fkey WHEN 'true' THEN person.zip ELSE package.zip END AS zip CASE fkey WHEN 'true' THEN person.placename ELSE package.city END AS city CASE fkey WHEN 'true' THEN person,country ELSE package.country END AS country CASE fkey WHEN 'true' THEN person.email ELSE package.email END AS email FROM Package LEFT OUTER JOIN Person ON Person.id = Package.pid WHERE Package.id = [value] Så vidt jeg vet vil dette kunne fungere, men i mine øyne er det en stygg spørring, som ikke minst er TUNG å vedlikeholde. Dette må vel kunne løses med elegant enn jeg har skissert i spørringen over? Lenke til kommentar
roac Skrevet 29. mars 2007 Del Skrevet 29. mars 2007 Du kan jo trekke person/adresseinformasjon ut i en egen tabell, som de to andre tabellene refererer til. Ellers bør du ta en liten titt på union, som lar deg så sammen resultatet av to spørringer. Da kan du først hente ut alle som bruker fremmednøkkel, deretter alle som ikke gjør det. Det er forresten ikke behov for et eget felt for å se om du bruker fremmednøkkel eller ei, du kan sjekke om fremmednøkkelen "is null". Lenke til kommentar
FunkyMonk Skrevet 29. mars 2007 Forfatter Del Skrevet 29. mars 2007 Jo, men dette var bare et eksempel for å illustrere hva jeg er på jakt etter... Så det finnes altså ikke noen andre alternativer til kontrollstruktur enn den over? Lenke til kommentar
Harald Staff Skrevet 29. mars 2007 Del Skrevet 29. mars 2007 Så du sjekket ikke UNION ? Pseudokode: Select Fremmed.Navn, Fremmed.Greier where Nøkkel.Fremmed = True Union Select Annet.Navn, Annet.Greier where Nøkkel.Fremmed=False HTH. Beste hilsen Harald Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå