Avatar billede tinem Novice
29. november 2009 - 13:17 Der er 17 kommentarer og
1 løsning

Hente indhold fra 2 tabeller

Jeg har denne tabel "content_type_copenhagen" og kode som henter ALT fra denne tabel

$query = "SELECT * FROM content_type_copenhagen WHERE 1";

Nu har jeg brug for KUN at vise denne tabels indhold hvis det passer sammen med indhold fra en anden tabel som hedder term_data og field hedder "name" og indholdet er "Roskilde kommune".

Altså indhold som er indtastet af Roskilde kommune, men som desværre ikke lægger sig i tabellen content_type_copenhagen, men i en anden tabel som nævnt ovenfor.

Det er fra en Drupal side og jeg skal først forstå hvordan det gøres i alm. sql før jeg kan lave det om til Drupals måde at gøre det på.
Avatar billede Dan Nim Seniormester
29. november 2009 - 13:36 #1
Du mangler at definere hvilken felter der "kun passer sammen" i begge tabeller. Hvad skal der matches på mellem de 2 tabeller.

F.eks. (tænkt tænkt eksempel )

$query = "SELECT * FROM content_type_copenhagen c INNER JOIN term_data td ON c.cityid = tc.cityid WHERE td.name = 'Roskilde kommune'";
Avatar billede Dan Nim Seniormester
29. november 2009 - 13:38 #2
doh, stavebøf, Rettet:

SELECT * FROM content_type_copenhagen c
INNER JOIN term_data td ON c.cityid = td.cityid
WHERE td.name = 'Roskilde kommune'
Avatar billede tinem Novice
29. november 2009 - 14:19 #3
Dette er hvor info bliver gemt for ALLE kommuner http://www.tinemuller.dk/test_drupal/div/content_type_copenhagen.sql, MEN så bliver det splittet ud på den enkelte kommune som her http://www.tinemuller.dk/test_drupal/div/term_data.sql

Brug Odense kommune istedet for, fordi jeg endnu ikke har indtastet info for Roskilde kommune.
29. november 2009 - 15:33 #4
Lad mig "brainstorme" det lidt.  Du har i tabel "content_type_copenhagen" en lang raekke oplysninger om toiletter hvor den femte oplysning er 'field_city_value'.  I de foerste fem-seks linier er vaerdien i dette felt "Koebenhavn K", "Koebenhavn V", o.s.v.  Men saa viger du ud saaledes at for eksempel i de sidste to linier staar der i 'field_city_value' "Odense - Toilet1 - Handicap" og "Odense - Toilet - Unisex".  Det er ikke bynavne, 'city_value's.  Hvis det er meningen at du vil lave en query der kun viser toiletter i bestemte byer ville vejen frem vaere i 'field_city_value' at give bynavnet og intet andet.  Saa ville queryen ganske enkelt vaere:  "SELECT * FROM content_type_copenhagen WHERE field_city_value = 'Odense'

Det er ikke helt klart (for mig) hvad du bruger tabellen "term_data" til.  Bortset fra de foerste to fields 'tid' og 'vid' er der ingen af felterne i de to tabeller der synes at matche, og du synes at bruge 'tid' og 'vid' paa forskellige maader i de to tabeller.

Fortael lidt mere om dit projekt, hvad formaalet er, hvor du faar dine data fra, o.s.v.  Et umiddelbart gaet er at du er temmelig ny med hensyn til databaser og ville foroege chancen for success med projected ved at bruge lidt tid med en simpel tutorial (jeg fandt en paa dansk, http://www.netexplorer.dk/SQL_TUTORIAL/index.php)
Avatar billede tinem Novice
29. november 2009 - 16:08 #5
Hvis field "name" fra term_data var inde i tabel content_type_copenhagen ville det vel nogenlunde se sådan ud:

$query = "SELECT * FROM content_type_copenhagen WHERE name = Odense kommune";

Men nu er problemet at den er i en anden tabel.

Hvis du har mod på det kan du læse nærmere om mit projekt her http://drupaldanmark.dk/forum/spoerg-hjaelp/generelle-spoergsmaal/cck-importexport-brug-hjaelp
29. november 2009 - 18:41 #6
Det har jeg saa gjort (kikket paa dit link og de links det linker til.  Her er hvordan jeg forstaar HVAD du vil.  (Jeg skriver HVAD med stort for at adskille det fra HVORDAN som jeg kommer til om lidt.)  Altsaa HVAD du vil er dette:  Du vil samle oplysninger om offenlige toiletter og deres beliggenhed og egenskaber paa en saadan maade at: (1) Folk kan faa de oplysninger UD de har brug for, Google Maps med beliggenhed og tekst med egenskaber. (2) Folk kan putte nye oplysninger IND. (3) Jeg laeser mellem linierne at man skal kunne sammenligne serviceniveauet i kommunerne.  Er det mere eller mindre rigtigt hertil?

Saa kommer spoergsmaalet HVORDAN.  Du har valgt at bruge Drupal Contents Management System og deres CCKs.  Jeg kender ingen af delene (jeg har lige googled lidt rundt,) saa jeg vil ikke kunne levere den endelige loesning. 

Ikke desto mindre haaber jeg at kunne komme med nogle kommentarer som vil hjaelpe paa vej mod loesningen.  Jeg skal sige dig noget, mens jeg laeste dine spoergsmaal paa Drupal Danmark siden saa begyndte jeg mentalt at formulere nogle svar.  Da jeg saa kom til Andreas Haugstrup's indlaeg saa sagde han lige hvad jeg sad og taenkte:  Et toilet i Odense og et i Koebenhavn er den samme kontent-type.  Kommunen er en egenskab (han siger taxonomi) ved toilettet netop som betaling, kanylebeholder, o.s.v. 

Et er hvordan du putter oplysningerne i databasen, et andet er hvordan du traekker dem ud.  Du skal bevare oplysningerne i overensstemmelse med deres struktur, her toiletter i alle kommuner i en tabel.  Du traekker dem saa ud afhaengig af hvordan du vil bruge oplysningerne.  Du synes at ville vise toiletterne per kommune.

Du behoever kun en enkelt "node" hvor du varierer indhold afhaengig af brugeren's kommune (som jeg gaar ud fra at du kender for eksempel fra log-in.)  Saa du laver en tabel med 98 linier, i hver linie et kommune navn og et geografisk midtpunkt. Naar saa en bruger logger ind saa henter du det rigtige kort (SELECT ..kortet.. FROM ..listen.  WHERE NAME = $kommune) og plotter toiletterne in (SELECT * FROM tabellen WHERE kommune= $kommune).  Hvis saa brugeren kun maa tilfoeje oplysninger fra hans egen kommune bliver insert queryen noget i retning af IF(..kommune = $brugeren's kommune) INSERT INTO tabellen ............  ELSE echo "Du maa kun indfoere oplysninger vedroerende din egen kommune.

Det foelger alt sammen teorien om "model and view" hvor grundoplysningerne ligger i en enkelt model hvorfra man saa traekker oplysninger og formatterer dem som man vil.  For eksempel i et vejr-system, enten man nu vil vise temperaturen i en tabel eller vil tegne et termometer eller vil vise en farve (jo varmere jo roedere) saa er det det samme temperatur-tal i databasen man bruger.

Tabte jeg dig undervejs?  Jeg gentog stort set kun hvad folk paa Drupal Danmark sagde.  Jeg haaber mine kommentarer er til nytte og ikke bare forvirring.
Avatar billede tinem Novice
01. december 2009 - 09:36 #7
Tusind tak for dit svar og interesse for mit projekt. ALT er forklaret her http://digitaliser.dk/resource/432100, hvis du endnu ikke har læst dette.

Drupal arbejder på en speciel måde, men da der endnu ikke er udviklet gode nok moduler til Google Maps API, så lavede jeg det uden disse og det fungerer da nogenlunde.

Forstår ikke rigtig helt hvordan jeg skal lave tabellerne ud over de 2 tabeller som jeg har vist og som bliver lavet automatisk af Drupal, kan du hjælpe yderligere?

Du behoever kun en enkelt "node" hvor du varierer indhold afhaengig af brugeren's kommune (som jeg gaar ud fra at du kender for eksempel fra log-in.)  Saa du laver en tabel med 98 linier, i hver linie et kommune navn og et geografisk midtpunkt. Naar saa en bruger logger ind saa henter du det rigtige kort (SELECT ..kortet.. FROM ..listen.  WHERE NAME = $kommune) og plotter toiletterne in (SELECT * FROM tabellen WHERE kommune= $kommune).
Avatar billede tinem Novice
01. december 2009 - 16:53 #8
Jeg er kommet lidt videre, men det må altså kunne gøres noget smartere, men synes da selv at jeg har været kreativ. Men mangler mere viden om PHPMySQl og Drupal.

Jeg har opdateret tabellen http://www.tinemuller.dk/test_drupal/div/content_type_copenhagen.sqltil at omfatte field term_data og så de forskellige kommuner.

$query = "SELECT * FROM content_type_copenhagen WHERE term_data = 'Københavns kommune'";
//$query = "SELECT * FROM content_type_copenhagen WHERE term_data = 'Odense kommune'";
//$query = "SELECT * FROM content_type_copenhagen WHERE term_data = 'Roskilde kommune'";

Disse bliver splittet ud i 3 forskellige filer:
map_data.xml.php med
$query = "SELECT * FROM content_type_copenhagen WHERE term_data = 'Københavns kommune'";

odense_kommune_map_data.xml.php med
$query = "SELECT * FROM content_type_copenhagen WHERE term_data = 'Odense kommune'";

roskilde_kommune_map_data.xml.php med
$query = "SELECT * FROM content_type_copenhagen WHERE term_data = 'Roskilde kommune'";

Og ellers er de ens.

På samme måde er der 3:
map_functions.js - odense_kommune_map_functions.js - roskilde_kommune_map_functions.js fordi de jo nu linker til de 3 andre filer som ovenfor.

Det virker faktisk meget godt, og linket til radius kortet for Hele Danmarker virker fint for alle 3 kort, men skal have fundet ud af hvordan jeg får de forskellige toiletter på hhv. deres eget kort, men det er nok en Drupal ting.
01. december 2009 - 21:31 #9
Jamen til lykke med at du nu har et toilet's kommune i den samme tabel som alle de andre oplysninger om toilettet.  Saa er vel egenlig dit oprindelige spoergsmaal besvaret.  Du havde oprindeligt toiletter i alle kommuner i tabellen content_type_copenhagen bortset fra at toilettet's kommunen sad i en anden tabel, term_data.  Dit spoergsmaal var hvordan du lavede en query paa oplysninger fra de to tabeller.  I dit indlaeg #5 sagde du at hvis kommunens navn var i content_type_copenhagen ville det vaere saa nemt, men problemet er at det var i en anden tabel.  Saa det oplagte spoergsmaal var hvorfor du saa valgte at laegge kommunenavnet i en anden tabel!  Du har nu valgt om igen, og dermed er dit oprindelige query problem loest.  (Men det ville vel egenligt vaere logisk at aendre tabellen's navn til content_type_danmark.)  Hvis mine kommentarer har kunnet vaere lidt hjaelp til selvhjaelp saa glaeder det mig.

Men dermed er dit project naturligvis ikke gjort.  Du brainstormer det lidt i indlaeg # 8 men stiller ikke egenlige spoergsmaal.  Saa jeg kunne jo holde min mund.  Under alle omstaendigheder maa jeg paa nuvaerende tidspunkt begraense mig fordi jeg staar og skal til udlandet (det vil sige Danmark - jeg bor i Belgien) ugen ud.

Jeg skal vove den kommentar at du goer det for svaert for dig selv.  Du vil lave 98 forskellige filer der er ens bortset fra kommunenavnet og du vil lave 98 forskellige map_functions.  Det bliver en stor historie, efter min mening unoevendig stor. 

Paa hvilket tidspunkt vil du egentlig vise en hjemmeside med toiletter?  Er det ikke naar der er en bruger fra en bestemt kommune der logger ind?  Saa det er foerst paa dette tidspunkt at du skal udvaelge toiletter fra content_type_copenhagen.  Der er ingen grund til permanent at have forskellige filer. 

Hvordan ser din mapfunktion ud?  Hvad er forskellen paa odense_kommune_map_function.js og roskilde_kommune_map_function.js?  Jeg vil gaette at de eneste forskelle er laengde- og breddegraderne for kommunen's centrum og maaske detaljeringsgraden.  I stedet for 98 forskellige map_functions kunne du lave en enkelt map_function med tre parameters, laengdegrad, breddegrad, og detaljeringsgrad, i pseudo-kode saadan noget som

function map_function(l, b, d)
{
}

Saa har du en "look-up" tabel noget i retning af

CREATE TABLE kommune(navn VARCHAR(20), bredte DOUBLE(2,6), laengte DOUBLE(2,6), detail INT);
INSERT INTO kommune VALUES('Odense', 54.123456, 15.12345, 8);
INSERT INTO kommune VALUES('Roskilde', 55,123456, 16,123456, 9)

Naar saa en bruger logger ind saa (1) laver du foerst en variabel $kommune med kommunenavnet fra brugerens profil, lad os sige Odense (det er hvor H.C.Andersen og jeg er foedt), (2) saa siger du: "SELECT * FROM kommune WHERE navn=$kommune" og putter laengte, bredte, og detail i variable $l, $b, og $d, saa (3) tegner du kortet med map_function($l, $b, $d) og saa finder du toiletterne derskal plottes ind ved SELECT .... FROM content_type_danmark WHERE term_data = $kommune.

Hvis saa brugeren fra Odense vil komme med oplysninger om yderligere toiletter i Odense saa tester du foerst om han maa have lov (hvis du stadig kun vil tillade opdateringer fra ens egen kommune) og saa en INSERT query, altsaa noget i retning af "IF($_POST['kommune']=$kommune
{INSERT INTO content_type_danmark ..........}

Det blev et langt indlaeg.  Det korte af de lange er at jeg foreslaar at du holder dine toilet-data i database tabellen indtil du skal bruge dem til en konkret hjemmeside i stedet for at lave 98 filer og at du laver en enkel map_function med tre parameter i stedet for 98 map_functions. 

Proev at fyr det af paa Drupal forumet.  Jeg vil gaette paa at de siger nogenlunde det samme.
Avatar billede tinem Novice
02. december 2009 - 08:15 #10
<i>Jamen til lykke med at du nu har et toilet's kommune i den samme tabel som alle de andre oplysninger om toilettet.  Saa er vel egenlig dit oprindelige spoergsmaal besvaret.</i>

Jeg nøjes med at forholde mig til dette. Jeg har IKKE fået det til at virke med gjort det MANUELT i tabellen, da jeg ikke fik nogen løsning til hvordan jeg skulle gøre det.

I Drupal er der noget som hedder VIEWS og som laver alt mysql koden automatisk, f.eks. hvis du trykker på linket List Odense kommune http://www.tinemuller.dk/test_drupal/view/list/odense så er koden for denne VIEW:

SELECT node.nid AS nid,
node.created AS node_created
FROM node node 
INNER JOIN term_node term_node ON node.vid = term_node.vid
WHERE (node.status <> 0) AND (node.type in ('copenhagen')) AND (term_node.tid = 7)
ORDER BY node_created DESC

Så kan mit oprindelige spørgsmål om disse 2 tabeller som jeg linker til ikke laves om til mysql kode med noget INNER JOIN eller LEFT JOIN eller hvad ved jeg? Problemet er jo at jeg ikke ved nok om MySQL og det var i første omgang det jeg spurgte om hjælp til og så må jeg ta' resten derfra. :-(
Avatar billede tinem Novice
02. december 2009 - 10:27 #11
dannim skrev:

SELECT * FROM content_type_copenhagen c
INNER JOIN term_data td ON c.cityid = td.cityid
WHERE td.name = 'Roskilde kommune'

Kunne du uddybe hvad
c betyder?

td ON betyder?

td.name betyder?

Har prøvet at søge på Google men kan simpelthen ikke finde noget sted hvor sådan mysql kode er forklaret. :-(
Avatar billede Dan Nim Seniormester
02. december 2009 - 11:07 #12
c og td er blot et alias for tabellerne - du kan godt skrive tabel navnet istedet

Så:

SELECT * FROM content_type_copenhagen
INNER JOIN term_data ON content_type_copenhagen.cityid = term_data.cityid
WHERE term_data.name = 'Roskilde kommune'

Er det samme som:

SELECT * FROM content_type_copenhagen c
INNER JOIN term_data td ON c.cityid = td.cityid
WHERE td.name = 'Roskilde kommune'

Det er ikke en krav/nødvendig at bruge aliases - Men jeg vil anbefalde det, da du uden tvivl på et tidspunkt vil kommme ud for at et felt hedder det samme i 2 tabeller, og så skal du bruge det. Jeg bruger det altid.

ON bruges i en JOIN (eller man kan bruge using)

Måske bør du læse lidt om mysql's syntax:

http://dev.mysql.com/doc/refman/5.0/en/select.html
http://dev.mysql.com/doc/refman/5.0/en/join.html

Mvh
Dan
Avatar billede tinem Novice
02. december 2009 - 11:13 #13
INDEN jeg fik læst dit indlæg fik jeg det til at virke ved at bruge dine koder, men sammen med en anden tabel http://www.tinemuller.dk/test_drupal/div/term_node.sql

For Odense kommune
$query = "SELECT * FROM content_type_copenhagen c
INNER JOIN term_node tn ON c.nid = tn.nid
WHERE tn.tid = '7'";

og så skifter jeg bare '7' ud med hhv. 6 for København og 8 for Roskilde.

På denne måde kan jeg nu SLETTE den ekstra field som jeg selv indsatte i tabellen, hvilket vistnok ikke er god skik.

Tak for hjælpen. Må knokle videre. Hårdt arbejde. :-(
03. december 2009 - 15:53 #14
Ok, lukker du svaret?
Avatar billede tinem Novice
08. december 2009 - 16:25 #15
Vil gerne gi' 100 point til hver, men kan ikke se hvordan jeg skal gøre det i denne tråd?
08. december 2009 - 19:21 #16
Her er et svar fra mig.  Jeg gaar ud fra at Dannim ogsaa sender et svar.  Saa skal du klikke i de to svar hvorved der fremkommer et felt hvor du kan acceptere svarene og give points.
Avatar billede tinem Novice
09. december 2009 - 07:13 #17
Tak. Så venter jeg lige på Dannim.

Ærgerligt at I ikke ved noget om Drupal. Tror MIT problem er at der endnu ikke findes nogen som både ved noget om Drupal (kan lave moduler) samt er god til PHP MySQL samt Google Maps API. :-(
Heller ikke i det danske/engelske Drupal forum.
12. december 2009 - 06:06 #18
tinem, der kom ikke svar fra Dannim.  Ikke desto mindre ville det vaere godt at faa spoergsmaalet lukket.  Det giver god orden, og saa staar det ikke laengere som aabent i min liste af indlaeg.  Du har den udvej selv at lave et svar og give dig selv en del af pointsene.  Saa har du dem til raadighed hvis han dukker op.
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