14. april 2008 - 12:25Der er
13 kommentarer og 1 løsning
Hjælp til JOIN ? i samme tabel !
Skal lave et udtræk, hvor jeg skal JOINE (hvis dette er løsningen) noget fra samme tabel.
Eks. på tabel:
TABEL virksomheder
id navn filial_id
Problemet er nu at en virksomhed kan være filial til en anden virksomhed i samme tabel.
Eks.
id: 1 navn: Bagerforretning filial_id: 2
id: 2 navn: Smedeforretning filial_id: 34
Her ses at 'Bagerforretning' er en filial af 'Smedeforretning' og derfor vil jeg gerne have navnet 'Smedeforretning' udskrevet, ud fra min kode herunder:
SELECT v1.navn FROM virksomheder v1 WHERE v1.id IN (SELECT v2.filial_id FROM virksomheder v2);
Nu vil du få udskrevet alle de virksomhedsnavne, som er filial for andre virksomheder (eller sig selv, for den sags skyld, hvis dette kan lade sig gøre).
Du har fat på noget, men det skal kun vises når jeg eks. søger på navnet. Nu udskriver den jo bare alle navnene på skærmen, men som du kan se i mit script længere opppe på siden, skal det jo kun vises når man søger på en virksomhed men samtidig også vise alle andre søge resultaterne.
eks. på hvordan jeg gerne vil have det
Jeg søger på "norde" ved hjælp af scriptet ovenover.
---------------------
nordea københavn filial af nordea danmark nordea århus filial af nordea danmark nordea danmark nordens fragtselskab
hmm, så vidt jeg kan se, vil du gerne have skrevet alle virksomhederne ud, hvor "norde" indgår i navnet, uanset om de er filialer for andre virksomheder eller ej.. er dette korrekt forstået?
Det er jo det samme jeg har skrvet oppe i mit script?
Tror vi snakker lidt forbi hinanden, det du skriver er rigtigt nok (selvom det er det jeg også har i mit script). men der skal tilføjes, så når man søger på en virksomhed skal den også vi om den pågældende virksomhed er filial af en anden virksomhed. Jeg kan sagtens udskrive id'et på (som også ses i scriptet) på virksomheden som er "hovedvirksomhed".
eks.
nordea brønshøj Filial af 1687
Istedet for et tal "1687" skal der står eksempelvis nordea danmark. Problemet ligger jo i at alle virksomhederne ligge i samme tabel, og ikke i hver sin tabel, hvor en JOIN ville være at foretrække. Håber at det forklarede det lidt bedre...
SELECT v1.navn, v2.navn FROM virksomhederv1, virksomheder v2 WHERE v1.navn LIKE '%" . $virksomhedsnavn . "%' AND v1.filial_id = v2.id ORDER BY navn;
Her vil du hente alle virksomheder ud, som matcher søgestrengen, samt navnet på deres filialer. Dog vil den kun returnere virksomheder, som rent faktisk har en filial. Hvis du vil have alle virksomheder med, hvad enten de har filial eller ej, og du så vil have skrevet navnet ud på dem som har, så skal virksomheder v2 outer joines på istedet (mener jeg nok)..
Det virker halvt nu. Du skriver noget med OUTER JOIN, er der noget der hedder det?
Når man søger udskriver den kun virksomheder der matcher med søgeordet og virksomheder med et filial_id, dvs. alle virksomheder uden et filial_id bliver udelukket!
eks. søgeordet er "nordea"
resultat: nordea københavn nordea østerbro -------------------------------------------------------------------------------------
dvs. den udelader faktisk nordea danmark på grund af at det jo ikke er en filial af noget.
SELECT DISTINCT v1.navn, v1.filial_id, v2.id, v2.navn AS navne FROM virksomheder AS v1 JOIN virksomheder AS v2 WHERE v1.navn LIKE '%" . $virksomhedsnavn . "%' AND v1.filial_id = v2.id ORDER BY navn
jep, det er netop derfor man outerjoiner udtrykket på, dvs. medtager dem, for hvilke joinet ikke gælder. jeg kan dog ikke lige helt gennemskue syntaksen for dette, da det er et stykke tid siden, jeg havde behov for at lave den slags udtryk :)
SELECT v1.navn, v2.navn FROM virksomheder v1 OUTER JOIN virksomheder v2 ON v1.filial_id = v2.id WHERE v1.navn like '%" . $virksomhedsnavn . "%' ORDER BY v1.navn;
Jeg tror det er noget i den retning, men er ikke sikker.. alternativt, så prøv med RIGHT OUTER JOIN istedet for OUTER JOIN.. og lad mig vide, hvad der sker :)
Den vil stadig kun skrive de virksomheder ud der har en filial, ikke virksomheder uden!!!
SELECT v1.navn, v1.filial_id, v2.id, v2.navn AS navne FROM virksomheder AS v1 RIGHT OUTER JOIN virksomheder AS v2 ON v1.filial_id = v2.id WHERE v1.navn LIKE '%" . $virksomhedsnavn . "%' ORDER BY navn
Nu virker det, der skulle simpelthen bare en LEFT JOIN på.
SELECT v1.navn, v1.filial_id, v2.id, v2.navn AS navne FROM virksomheder AS v1 LEFT JOIN virksomheder AS v2 ON v1.filial_id = v2.id WHERE v1.navn LIKE '%" . $virksomhedsnavn . "%' ORDER BY navn
aargh selvfølgelig, det er LEFT JOIN der skulle til.. det er jo netop det venstre udtryk du altid vil have med, og det højre som skulle med, der hvor det passede..
well, godt du fik det til at virke :) det er jo det vigtigeste.. min kollega i cybercity viste mig lige en opgave idag, med præcis samme problemstilling, hvor det så gik op for mig, at det var LEFT JOIN vi manglede :) hehe
Synes godt om
Ny brugerNybegynder
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.