Avatar billede telly Nybegynder
27. september 2005 - 20:39 Der er 19 kommentarer og
1 løsning

Lave et array i array med udtræk fra mysql db

Jeg har brug for at lave en træstruktur menu ud fra en masse tabeller i en mysql db.
Hver tabel er et undermenu i et træ

f.eks.

Europa (verdensdel tabel)
  Danmark (lande tabel)
    København (by tabel)
      Nørrebro bydel tabel)

osv...

Nogen der kan hjælpe mig?
Avatar billede terrak Nybegynder
27. september 2005 - 20:49 #1
Kan du smide et dump ind af tabel/databasestrukturen?
Avatar billede telly Nybegynder
27. september 2005 - 20:53 #2
Det kan du tro, terrak

Strukturen er som følgene:

region
  country
    unit
    office
      computer->computer description
        user
historik       
       

DROP TABLE IF EXISTS `gg_country`;
CREATE TABLE `gg_country` (
  `id` int(11) NOT NULL auto_increment,
  `gg_country` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_historik`;
CREATE TABLE `gg_historik` (
  `id` int(11) NOT NULL auto_increment,
  `pid` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_office`;
CREATE TABLE `gg_office` (
  `id` int(11) NOT NULL auto_increment,
  `gg_office` varchar(50) NOT NULL default '',
  `pid` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_pc_description`;
CREATE TABLE `gg_pc_description` (
  `id` int(11) NOT NULL auto_increment,
  `pc_name` varchar(150) NOT NULL default '',
  `pc_desciption` varchar(150) NOT NULL default '',
  `pid` int(11) NOT NULL default '0',
  `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_pc_name`;
CREATE TABLE `gg_pc_name` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_region`;
CREATE TABLE `gg_region` (
  `id` int(11) NOT NULL auto_increment,
  `gg_region` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_unit`;
CREATE TABLE `gg_unit` (
  `id` int(11) NOT NULL auto_increment,
  `gg_department` varchar(100) NOT NULL default '',
  `gg_dep_short` varchar(10) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_user`;
CREATE TABLE `gg_user` (
  `id` int(11) NOT NULL auto_increment,
  `firstname` varchar(50) NOT NULL default '',
  `middlename` varchar(50) NOT NULL default '',
  `lastname` varchar(50) NOT NULL default '',
  `title` varchar(50) NOT NULL default '',
  `pid` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Avatar billede telly Nybegynder
27. september 2005 - 20:53 #3
hov jeg mente:

region
  country
    unit
      office
        computer->computer description
          user
historik
Avatar billede telly Nybegynder
27. september 2005 - 20:57 #4
Jeg sad også og kiggede på om jeg kunne få en "type" ind i strukturen lige inden "office". Type ville være om det var en "desktop" eller en "laptop", men jeg kunne ikke rigtig få den til at hænge sammen... Hvis i har nogen forslag til hvordan det kan løses så er jeg lutter ører og point :D
Avatar billede terrak Nybegynder
27. september 2005 - 20:59 #5
Jeg er lidt forvirret. Hvad skete der med tabellerne verdensdel, lande, by, bydel?
Avatar billede telly Nybegynder
27. september 2005 - 21:00 #6
hehe det var bare et eksempel, men stadig samme struktur
Avatar billede telly Nybegynder
27. september 2005 - 21:01 #7
For mig er det lige meget hvad et hjælpende eksempel består af, jeg er bare gået lidt i sort med hvordan jeg laver udtrækkene på en måde så jeg kan lave en træ menu.
Avatar billede terrak Nybegynder
27. september 2005 - 21:03 #8
Jeg synes nu ellers tabelantallet er blevet fordoblet :)

Hvis jeg har forstået det ret, søger du et script som henter al data fra fire tabeller. Scriptet starter med en verdensdel og forgrener sig så til lande > by > bydel ?
Avatar billede telly Nybegynder
27. september 2005 - 21:12 #9
Ja lige nøjagtigt, men bare for at der ikke opstår misforståelser så laver jeg lige et eksempel på data der kan ligge i den enkelte tabel...

Europa (region)
  Danmark (country)
    København (unit)
      IT-afdelingen (office)
        IBM T42-> Pentium M, 1.80 Ghz osv... (computer)->(computer description)
          Lars Larsen (user)

relationerne mellem tabellerne er:

M = mange

"region" 1-M "country" 1-M "unit" 1-M "office" 1-M ("computer" 1-1 "computer description") M-M "user"
Avatar billede telly Nybegynder
27. september 2005 - 21:13 #10
håber ikke jeg forvirrer mere end højst nødvendigt :S
Avatar billede terrak Nybegynder
27. september 2005 - 21:42 #11
Jeg er stadig lidt i tvivl præcist hvad det er du vil, men i det her eksempel kan du fylde nogle værdier ind, og så skulle den gerne outputte:
Verdendel>Land>By>Bydel
ind til der ikke er mere data. Hvis det lyder rigtigt kan jeg godt lave PHP koden som smider det ind i et array.


--
Struktur
--

CREATE TABLE `bydel` (
  `id` int(6) NOT NULL auto_increment,
  `bydelnavn` varchar(50) collate utf8_danish_ci NOT NULL default '',
  `byid` int(6) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

CREATE TABLE `lande` (
  `id` int(5) NOT NULL auto_increment,
  `landnavn` varchar(50) collate utf8_danish_ci NOT NULL default '',
  `vdid` int(3) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

CREATE TABLE `minby` (
  `id` int(6) NOT NULL auto_increment,
  `bynavn` varchar(50) collate utf8_danish_ci NOT NULL default '',
  `landid` int(4) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

CREATE TABLE `verdensdel` (
  `id` int(3) NOT NULL auto_increment,
  `vdnavn` varchar(50) collate utf8_danish_ci NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;


--
Data
--

INSERT INTO `bydel` VALUES (1, 'Bydel1', 1);
INSERT INTO `bydel` VALUES (2, 'Bydel2', 2);
INSERT INTO `bydel` VALUES (3, 'Bydel3', 2);
INSERT INTO `bydel` VALUES (4, 'Bydel4', 5);
INSERT INTO `bydel` VALUES (5, 'Bydel6', 6);
INSERT INTO `bydel` VALUES (6, 'Bydel7', 6);
INSERT INTO `bydel` VALUES (7, 'Bydel8', 6);
INSERT INTO `bydel` VALUES (8, 'Bydel9', 7);
INSERT INTO `bydel` VALUES (9, 'Bydel8', 8);
INSERT INTO `lande` VALUES (7, 'Land1', 12);
INSERT INTO `lande` VALUES (8, 'Land2', 12);
INSERT INTO `lande` VALUES (9, 'Land3', 12);
INSERT INTO `lande` VALUES (10, 'Land4', 13);
INSERT INTO `lande` VALUES (11, 'Land5', 13);
INSERT INTO `minby` VALUES (1, 'By1', 7);
INSERT INTO `minby` VALUES (2, 'By2', 7);
INSERT INTO `minby` VALUES (3, 'By3', 8);
INSERT INTO `minby` VALUES (4, 'By4', 9);
INSERT INTO `minby` VALUES (5, 'By5', 9);
INSERT INTO `minby` VALUES (6, 'By6', 11);
INSERT INTO `minby` VALUES (7, 'By7', 11);
INSERT INTO `minby` VALUES (8, 'By8', 11);
INSERT INTO `verdensdel` VALUES (12, 'Verdendel1');
INSERT INTO `verdensdel` VALUES (13, 'Verdensdel2');

--
Query
--

SELECT
verdensdel.`vdnavn`,
lande.`landnavn`,
minby.`bynavn`,
bydel.`bydelnavn`
FROM `verdensdel`,`lande`,`minby`,`bydel` where
verdensdel.`id` = lande.`vdid`
AND
lande.`id` = minby.`landid`
AND
minby.`id` = bydel.`byid`
Avatar billede terrak Nybegynder
27. september 2005 - 21:59 #12
Og det var så baseret på det første du skrev :)

Korrekt eller ej, så må yderligere input fra undertegnede komme efter sleep(60*60*9), da jeg føler mig nødsaget til at diskdefragmentere min biologiske harddisk.
(Sagt på en anden måde: Jeg er træt :-)
Avatar billede telly Nybegynder
27. september 2005 - 23:15 #13
Ja jeg er vist også på vej i seng...jeg fik lige hurtigt skrevet noget SQL... det passer dog ikke med relationerne...

$sql =  "SELECT gg_region, gg_country, gg_unit_long, gg_unit_short, gg_office, gg_pc_name"." ";
$sql .= "FROM gg_region AS A, gg_country AS B, gg_unit AS C, gg_office AS D, gg_pc_name = E"." ";
$sql .= "WHERE A.id = B.pid AND B.id = C.pid AND C.id = D.pid AND D.id = E.pid";
Avatar billede telly Nybegynder
28. september 2005 - 12:46 #14
Jeg tror jeg bliver nød til at forklare mig lidt bedre...

Ud fra ovennævnte tabeller vil jeg gerne lave en træ menu til en webside. tabellerne skal hentes ud herakisk. Forstået på den måde at alt hvad der ligger i region skal vises som det yderste led i menuen. Hvis en af dem har en undermenu skal der vises et plus eller noget foran det (Det laver jeg ved hjælp af JS). Sådan skal det bliver ved videre ind i træet. Hver tabel er et led i træet og der kan godt forekomme flere undermenuer til en \"hovedmenu\".

Jeg vil gerne kunne trække dataerne ud i en given rækkefølge og lægge det i et array som jeg så itererer igennem og laver det visuelle ud fra.

Et eksempel på en udfoldet menu:

Europa
  Danmark
    København
    Kontor1
      Computer1
        Medarbejder1
      Computer2
        Medarbejder2
    Århus
  Sverige
  Stockholm
  Norge
USA


Håber det kunne opklare det bedre
Avatar billede terrak Nybegynder
28. september 2005 - 21:11 #15
Okay.. det skulle nok kunne lade sig gøre. Det er dog ikke sikkert jeg har tid til at se på det før fredag, så hvis der er andre der ude med et bud, så bare smid det ind :)
Avatar billede telly Nybegynder
29. september 2005 - 08:26 #16
Jeg har tænkt meget på om det kunne laves rekursivt, eller ved at hver gren har en funktion som så kalder næste funktion i ledet... Det er dog ikke lige min stærke side at lave den slags.
Avatar billede terrak Nybegynder
29. september 2005 - 17:21 #17
Det kunne man bruge hvis det hele lå som filer og mapper, men det kan gøres lidt smartere når det ligger i en database.
Avatar billede terrak Nybegynder
06. oktober 2005 - 16:16 #18
Jeg har den onde SQL query her, men den viser kun de steder hvortil der findes en bruger og en computerbeskrivelse:

SELECT
gg_region.`gg_region`,
gg_country.`gg_country`,
gg_unit.`gg_department`,
gg_office.`gg_office`,
CONCAT(gg_pc_name.`name`,' -> ',gg_pc_description.`pc_description`) AS `pc`,
CONCAT(gg_user.`firstname`,gg_user.`middlename`,gg_user.`lastname`) AS `user`
FROM
`gg_region`,
`gg_country`,
`gg_unit`,
`gg_office`,
`gg_pc_name`,
`gg_pc_description`,
`gg_user`
WHERE
gg_region.`id` = gg_country.`regionid`
AND
gg_country.`id` = gg_unit.`countryid`
AND
gg_unit.`id` = gg_office.`unitid`
AND
gg_office.`id` = gg_pc_name.`officeid`
AND
gg_pc_name.`id` = gg_pc_description.`id`
AND
gg_pc_name.`id` = gg_user.`id`

Det skal også lige tilføjes at jeg har oprettet et felt i hver tabel, så man kan holde står på hvad der tilhører hvad:

DROP TABLE IF EXISTS `gg_country`;
CREATE TABLE `gg_country` (
  `id` int(11) NOT NULL auto_increment,
  `regionid` int(11) NOT NULL default '0',
  `gg_country` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_historik`;
CREATE TABLE `gg_historik` (
  `id` int(11) NOT NULL auto_increment,
  `pid` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_office`;
CREATE TABLE `gg_office` (
  `id` int(11) NOT NULL auto_increment,
  `unitid` int(11) NOT NULL default '0',
  `gg_office` varchar(50) NOT NULL default '',
  `pid` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_pc_description`;
CREATE TABLE `gg_pc_description` (
  `id` int(11) NOT NULL auto_increment,
  `pcid` int(11) NOT NULL default '0',
  `pc_name` varchar(150) NOT NULL default '',
  `pc_description` varchar(150) NOT NULL default '',
  `pid` int(11) NOT NULL default '0',
  `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_pc_name`;
CREATE TABLE `gg_pc_name` (
  `id` int(11) NOT NULL auto_increment,
  `officeid` int(11) NOT NULL default '0',
  `name` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_region`;
CREATE TABLE `gg_region` (
  `id` int(11) NOT NULL auto_increment,
  `gg_region` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_unit`;
CREATE TABLE `gg_unit` (
  `id` int(11) NOT NULL auto_increment,
  `countryid` int(11) NOT NULL default '0',
  `gg_department` varchar(100) NOT NULL default '',
  `gg_dep_short` varchar(10) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `gg_user`;
CREATE TABLE `gg_user` (
  `id` int(11) NOT NULL auto_increment,
  `pcid` int(11) NOT NULL default '0',
  `firstname` varchar(50) NOT NULL default '',
  `middlename` varchar(50) NOT NULL default '',
  `lastname` varchar(50) NOT NULL default '',
  `title` varchar(50) NOT NULL default '',
  `pid` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Jeg ved dog ikke hvordan query'en skal se ud, for at man får det som du gerne vil have. Jeg ved dog godt hvordan det skal laves, på en anden måde, men det kræver en query for hver undermenu der åbnes, og det er ikke helt optimalt.
Avatar billede telly Nybegynder
31. januar 2006 - 15:56 #19
terrak smid et svar så får du lige point, som tak for input.
Avatar billede telly Nybegynder
04. september 2009 - 08:30 #20
Lukkes
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