Avatar billede munkx Nybegynder
31. august 2012 - 13:36 Der er 8 kommentarer og
1 løsning

Spørgsmål angående joins i mysql

Hej

Jeg sidder fast med et problem i min SQL query, som jeg ikke har syntes at kunne finde noget svar til andre steder på nettet

Jeg har prøvet følgende:

SELECT * FROM templates t
LEFT JOIN modules m ON t.moduleid=m.id
JOIN * FROM m.tablename a ON a.id > 0
WHERE t.templateid=3

Så mit spørgsmål er følgende:
Er det muligt at kan få et tablename i en join og så bruge den som tablename til en tabel du vil joine i samme sætning.?

Håber i forstår hvad jeg mener eller kan se det, da jeg ikke er så god til at forklare ting på skrift.

Mvh.
Martin
31. august 2012 - 14:27 #1
Den query du skriver virker ikke, som du vel allerede har fundet ud af.
Men det står mig ikke helt klart, hvad du vil opnå. 
Du har tilsyneladende tabellen templates med felterne moduleid og templateid og måske flere.  Og du har tabellen modules med feltet id og flere felter.  Har du også en tabel tablename med felterne id og navn, og har modules et felt tableid eller lignende?  Hvis du så vil have alt fra tabellerne templates og modules skrevet ud plus navn fra tabellen tablename, så kan du bruge en query som denne:

SELECT t.*, m.*, a.navn
FROM templates t
LEFT JOIN  modules m ON t.moduleid = m.id
LEFT JOIN tablename a ON t.tableid = a.id
WHERE t.templateid = 3 AND a.id > 0

Hvis jeg har gættet forkert, så forklar yderligere, beskriv dine tabeller og sig hvad du vil opnå.
Avatar billede munkx Nybegynder
31. august 2012 - 14:48 #2
Hej Christian
Jeg prøver lige at forklare mine 3 databaser og hvad jeg prøver at opnå:
paranteser indeholder eksempel data

Templates indeholder følgende:
templateid ( 3 )
name ( Nyhedsoversigt )
filename ( News.php )
moduleid ( 1 )

modules indeholder:
id ( 1 )
title ( Nyheder )
folder ( module_news )
module_table ( table_news )

Det der så skal ske er:

jeg ved fra den side jeg er på at den template jeg bruger har id nummer 3 i databasen,
og ud fra dette id skal jeg finde alle nyheder som er i database tabellen table_news ( module_table )
så jeg kan liste alle nyheder der ligger i denne tabel.
Så på en eller anden måde skal jeg få joinet template tabellen med modules tabellen og derefter liste alt indeholde som er i table_news
Avatar billede munkx Nybegynder
31. august 2012 - 14:49 #3
Og prøver derfor at finde ud af om dette er muligt at gøre med et database kald eller om jeg bliver nød til at vælge tingene over flere gange over flere database kald
31. august 2012 - 16:00 #4
Du siger, at du skal finde alle nyheder som er i database system? Hvilket?
31. august 2012 - 23:48 #5
Det er noget vrøvl der står i mid indlæg #4.  Jeg ville have sagt, at du vil finde alle nyheder som er i database tabellen table_news.  Så ud over tabellen templates og tabellen modules er der en tredje tabel table_news.  Kan du vise, også, hvordan den tabel er opbygget og hvordan den hænger sammen med de andre tabeller?
Avatar billede munkx Nybegynder
03. september 2012 - 07:01 #6
Hej Christian, du må undskylde svar tiden.. men har desværre ikke haft tid her i weekenden til at kigge herinde.

Tabellen module_news indeholder følgende felter:
id, title, tekst, teaser, publish_date, publish_year, author

modules indeholder:
id, title, description, folder, prefix, module_table
Eksempel:
1, Nyheder, vedligeholdelse af nyheder, module_news, artikel, module_news

og template indeholder:
templateid, name, filename, moduleid
eksempel:
1, Nyheder, News, 1


og de hænger sådan sammen at jeg ud fra templateid kender hvilken module id jeg skal bruge,
og ud fra den module id skal jeg så finde frem til hvad table der skal bruges og hive alt information derfra ud

Håber det giver mere mening nu og at jeg har kunne forklare det bedre end de andre gang
03. september 2012 - 11:40 #7
Jeg fatter det desværre ikke.  Det er nok mig, der har en mental blokkade af en slags.  Vi bør nok slutte her, i stedet for at jeg spilder mere af din tid.  Dog prøver jeg at forklare, hvor jeg er forvirret.  Hvis du så vælger at lukke spørgsmålet, så er det i orden.  Ellers bliver du nødt til at svare på mine spørgsmål så enkelt og entydigt, at selv jeg kan forstå det.

Jeg forstår, at du har tabellerne modules og templates, og at tempplates.moduleid refererer til modules.id.  Så når du vælger en template kender du også modulen.

Men så siger du i #2, at de nyheder du skal finde er i database tabellen 'table_news'.  Jeg bad dig forklare, hvad denne tabel indeholder.  Det gjorde du så ikke.  I stedet beskrev du en tabel 'module_news'.  Sidder nyhederne i virkeligheden i tabellen 'module_news,' og skulle du i #2 have talt om at finde alle nyheder som er i database tabellen module_news?

Jeg forstår fra #2, at der til en module hører flere nyheder.  Er det samtidig således, at hver nyhed hører til kun en module?  I så fald burde der i tabellen module_news (hvis det er der nyhederne sidder) være et felt 'module_id' der fortæller til hvilken modul en nyhed hører. 

Jeg har lavet et diagram med de tre tabeller med et tilføjet module_id i tabellen module_news.  Kik her:  http://christianjorgensen.be/Billeder/Capture.JPG .

Med en sådan tabelstruktur skulle du kunne finde de nyheder der hører til en bestemt template, for eksempel template 3, med denne forespørgsel:

SELECT n.* FROM templates t JOIN modules m ON t.moduleid = m.id JOIN module_news n ON m.id = n.module_id WHERE t.templateid = 3
Avatar billede munkx Nybegynder
03. september 2012 - 12:37 #8
Module_news og table_news er den samme tabel, var mig der fik lavet en tanketorsk da jeg skrev det ned.

i #2 har et enkelt modul flere nyheder,
hvilket vil sige at hver nyhed høre til det samme modul id ( i dette tilfælde module id 1)
Så kan derfor ikke på module_news tilføje en module_id,

Er derfor jeg i tabellen modules har en module_table for at det skulle være muligt at trække alle nyheder ud der er i den table.

Jeg har vedlagt et link til databaserne jeg snakker om, så du kan hente det og se strukturen i det.

<a href="http://sprend.com/download.htm?C=c71ef4d570124668b75081a45fd02c2c" target="_blank">http://sprend.com/download.htm?C=c71ef4d570124668b75081a45fd02c2c</a>
03. september 2012 - 13:12 #9
Det skal jeg lige forstå rigtigt.  Du siger, tror jeg, for det første, at nyhederne ligger i tabellen module_news, for det andet, at hver nyhed i module_news hører til et og kun et module, for det tredje (og det er her jeg bliver snosk forvirret) at du derfor ikke kan tilføre et felt module_id til nyheden.  Prøv at forklare hvorfor ikke.  Normalt er det præcist det man gør i relationelle databaser, hvis en eller flere rækker i tabel1 hører til en række i tabel2, så tilføjer man i tabel1 et felt med id'en for den pågældende række i tabel2.

Måske går der et lys op for mig.  Du har vel ikke adskillige module_news tabeller, hvor hver tabel har de nyheder der hører til en enkelt modul?  I såfald er det spild af tabeller og imod de gængse principper for relationelle databaser.  Man bruger en tabel for hver 'slags' ting, altså en tabel med alle nyhederne.  For så at finde ud af hvilke nyheder der hører til hvilke moduler har man i tabellen med nyheder et felt med id'en for den pågældende modul.

Det link du viser synes at føre til at jeg får noget software downloaded.  Det vil jeg helst undgå.  Har du prøvet at åbne mit link og studeret de tabeler jeg viser?  Hvis du ikke synes det er nødvendigt, så kan vi nok ikke kommunikere.  I så fald foreslår jeg, at stopper her.
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
Computerworld tilbyder specialiserede kurser i database-management

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