Avatar billede axel21 Juniormester
14. april 2008 - 12:25 Der 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:

------------------------------------------------------------------

$result = mysql_query("SELECT * FROM virksomheder WHERE navn LIKE '%".$virksomhedsnavn."%' ORDER BY navn");

while($row = mysql_fetch_array($result))
        {
            echo "<tr><td><a href=\"#\" onclick=\"popup('visvirksomhed.php?virksomhedsid=".$row['id']."','mitvindue','655','390');return false;\">".$row['navn']."</a></td>";
       
                 
                echo "<td class=\"bottomtext\">".$row['filial_id']."<br></td></tr>";
                } 
------------------------------------------------------------------

Håber i forstår, da jeg syntes det er lidt indviklet at forklare...
Avatar billede rax Praktikant
16. april 2008 - 08:42 #1
dit SQL-udtryk skal se således ud:

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).

Håber det hjalp, ellers så skriv igen :)
Avatar billede axel21 Juniormester
16. april 2008 - 22:06 #2
Tak, prøver det på fredag.
Avatar billede axel21 Juniormester
30. april 2008 - 14:19 #3
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
Avatar billede rax Praktikant
30. april 2008 - 14:35 #4
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?
Avatar billede axel21 Juniormester
30. april 2008 - 14:46 #5
Ja det er korrekt.
Avatar billede rax Praktikant
30. april 2008 - 15:01 #6
ok, så forstod jeg ikke lige hvorfor du nævnte problematikken omkring filial-ID'er :)
anyway, dit udtryk skal se sådan ud:

SELECT navn
FROM virksomheder
WHERE navn LIKE '%" . $virksomhedsnavn . "%' ORDER BY navn;

den henter navnet ud på alle virksomhederne, som matcher søgestrengen, uanset deres filial-IDer
Avatar billede axel21 Juniormester
01. maj 2008 - 20:02 #7
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...
Avatar billede rax Praktikant
02. maj 2008 - 10:24 #8
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)..
Avatar billede axel21 Juniormester
04. maj 2008 - 10:07 #9
Prøver det så hurtigt som muligt...
Avatar billede axel21 Juniormester
08. maj 2008 - 14:21 #10
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
Avatar billede rax Praktikant
08. maj 2008 - 15:57 #11
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 :)
Avatar billede axel21 Juniormester
09. maj 2008 - 09:49 #12
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
Avatar billede axel21 Juniormester
09. maj 2008 - 09:59 #13
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

Smid et svar REX, g tak for hjælpen...
Avatar billede rax Praktikant
09. maj 2008 - 10:28 #14
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
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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