Avatar billede JacoDK Nybegynder
13. juli 2014 - 23:04 Der er 3 kommentarer og
1 løsning

Hent LEFT JOIN ud fra field værdier

Hej Eksperter,

Jeg håber i kan hjælpe mig med at løse et database problem.

Min database består af 3 tabeller, som grundlæggende ser således ud.

cl0udc_Product
- pID
- pName
- pNumber
cl0udc_Attach
- aID
- ppID, indeholder pID fra cl0udc_Product
- aAttach
cl0udc_Element
- eID
- eName
- ePrice

Formålet med databasen er at når et product hentes, skal den hente de vedlagte emner. Et eksempel kan være produktet VW Golf med varernummer 123. Til denne VW Golf er der vedlagt værdier i aAttach som er 1,2,5,7. Derpå ønsker jeg at disse værdier bliver hentet ved hjælp af en join i tabel cl0udc_Element, så jeg får 4 resultater fra mysql.

Jeg har prøvet med følgende mysql query, hvor jeg desværre ikke får det ønskede resultat.

SELECT * FROM `cl0udc_Product`
LEFT JOIN `cl0udc_Attach` AS `Attach` ON `Attach`.`aID`=`ppID`
LEFT OUTER JOIN `cl0udc_Element` AS `Element` ON `Attach`.`aAttach` = `Element`.`sNumber`
WHERE `pEAN`='123'

Kan man bruge contains, split eller andet ?
Avatar billede JacoDK Nybegynder
13. juli 2014 - 23:07 #1
ved en rigtig query havde jeg tænkt resultatet ser således ud:

Varernummer, Beskrivelse, Attach, Attach beskrivelse
123  VW Golf    1    Bildør
123  VW Golf    2    Sidespejl
123  VW Golf    5    Bakspejl
123  VW Golf    7    Anhænger
14. juli 2014 - 08:47 #2
Jeg gør et par observationer.  Når man joiner to tabeller skal man referer til et felt i hver tabel, men i din første JOIN refererer du til to felter aID og ppID der begge sidder i Attach tabellen.  Jeg ville skrive noget som:

SELECT * FROM clOudc_Product AS p LEFT JOIN clOudc_Attach AS a ON p.pID = a.aID o.s.v.

For så at kunne joine Attach og Element tabellerne skal du i en af tabellerne have et felt der refererer til et felt i den anden tabel på samme måde som du siger ppID indeholder pID.  Lad os sige, at du i Element tabellen havde et felt aaID der indeholder aID.  Så kunne din query blive således:

SELECT * FROM clOudc_Product AS p
LEFT JOIN clOudc_Attach AS a ON p.pID = a.aID
LEFT JOIN clOudc_Element AS e ON a.aID = e.aaID
o.s.v.

Endelig siger du 'WHERE pEAN = 123.  Du viser ikke i nogen tabel et felt der hedder pEAN.  Jeg vil gætte på, at du ønsker at selecte data hvor pID = 123.  I så fald bliver queryen således:

SELECT * FROM clOudc_Product AS p
LEFT JOIN clOudc_Attach AS a ON p.pID = a.aID
LEFT JOIN clOudc_Element AS e ON a.aID = e.aaID
WHERE p.pID = 123

Så et spørgsmål om datastruktur (jeg ved det ikke var det du spurgte om.)  Det er tydeligt at hvert product kan have mange attachments, der er en såkaldt 'en-til-mange' relation mellem de to tabeller.  Men er der også en 'en-til-mange' relation mellem attach og element, således at en attachment kan have mange elementer eller et element kan have mange attachments?  I så fald er din struktur rigtig.  Men hvis der til hvert attachment kun hører et element, altså en 'en-til-en' relation, så er der ingen grund til at have to tabeller.  Så ville det forenkle sagen at lave for eksempel følgende attach tabel og ingen element tabel:

cl0udc_Attach
- aID
- ppID
- aAttach
- eName
- ePrice

så din query bliver:

SELECT * FROM clOudc_Product AS p
LEFT JOIN clOudc_Attach AS a ON p.pID = a.aID
WHERE p.pID = 123

Og så lige en ting mere:  LEFT OUTER JOIN er i mysql det samme som LEFT JOIN.
Avatar billede JacoDK Nybegynder
14. juli 2014 - 17:08 #3
Hej Christian,

Tusind tak for din flotte beskrivelse :)

Jeg fandt en løsning på det hele ved at anvende FIND_IN_SET :)

Så min Query ser således ud, og giver det resultat jeg ønsker.

SELECT * FROM `cl0udc_Product`
LEFT JOIN `cl0udc_Attach` AS `Attach` ON `Attach`.`aID`=`ppID`
LEFT JOIN `cl0udc_Element` AS `Element` ON FIND_IN_SET(`Element`.`sNumber`, `Attach`.`aAttach`)
WHERE `pEAN`='5703302094085'


Den tidligere og nuværende database struktur er ikke ens, da jeg bare brugte et eksempel på min query :)

Du må gerne smide et svar Christian :)
14. juli 2014 - 21:24 #4
Svar fra mig.
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

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