|	id	|	 linknaam 	|	link	|	pagina		| kolom | categorie |
|	1	|	site 1		| http:// 1.nl/	|    	 jan    		|     1      |     zooi 1    |
|	2	|	site 2		| http:// 2.nl/	|    	 jan    		|     1      |     zooi 1    |
|	3	|	site 4		| http:// 5.nl/	|    	 jan    		|     1      |     zooi 2    |
|	4	|	site 19		| http:// 6.nl/	|    	 jan    		|     1      |     zooi 2    |
 


Nu wil ik daar zo’n soort array uit hebben:

1
--Zooi 1
---- site 1, http://www.site1.nl/
---- site 2, http://www.site2.nl/
--zooi2
---- site 4, http://5.nl/
---- site 19, http://6.nl/

oftwel:

kolom
--categorie
----linknaam, link

SELECT linknaam, link, kolom, categorie FROM tabel WHERE pagina = jan

Maar hoe moet ik dan verder gaan?
is dat niet gewoon met zoiets:
<?php
$query = mysql_query("SELECT * FROM table") or die("error");
while($r = mysql_fetch_array($query)){
echo $r['column_naam'] . "<br>\n";
echo $r['column_naam2'] . "<br>\n";
//enzovoort
}
?>
Ik denk dat je je datamodel moet gaan aanpassen...

Categorie:
id
parentId
name

Waarbij zooi1 en zooi2 een parentId 1 krijgen. Id 1 bevat de 'hoofdcategorie'. Op het moment dat je deze categorie selecteerd, kan je dus automatisch meerdere categorien gebruiken.

Wat je nu doet is eigenlijk de categorie bij de link zelf zetten, wat dus redundantie oplevert.
@Pim Vernooij:
Dat is exact wat ik dacht, en meestal doe in dit soort situaties, gewoon een `categorie` tabel, en in de 'andere' tabel een `categorie_id` maken, die gekoppeld is aan `categorie`.`id` zo kun je veel makkelijker alle gegevens uit een bepaalde categorie halen!
dus wat ik nu heb:


-- 
-- Tabel structuur voor tabel `categorie`
-- 

CREATE TABLE categorie (
  id int(5) NOT NULL auto_increment,
  categorie varchar(50) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

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

-- 
-- Tabel structuur voor tabel `links`
-- 

CREATE TABLE links (
  id int(11) NOT NULL auto_increment,
  linknaam text NOT NULL,
  link text NOT NULL,
  pagina text NOT NULL,
  kolom int(2) NOT NULL,
  categorie_id int(10) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


Zo dus,

2 tabellen, 1 met de categorieën en 1 met de links.

En hoe krijg ik dan HIER de array uit die ik wil?
Als je in je categorie tabel nou een 'parentId' kolom toevoegd, kan je subcategorien gebruiken. Als je de id's van die subcategorien in als categorie_id in je links kolom zet, kan je die weer herleiden naar je hoofdcategorie.

@andries: wat jij zegt doet hij al. Alleen ondersteund z'n datamodel op het moment geen subcategorieen.
Ik snap het niet Pim, waarom subcategorieën?

[edit]
ik heb het hier even wat duidelijker in een PDF je gezet.
[/edit]
whoops, ik heb wat verkeerd gelezen...
Je kan ze nu toch prima in een array zetten?

<?php
while( $link = mysql_fetch_assoc( $res ) ) {
$linkArray[$link['category_id']][] = $link;
}
echo "<pre>";
echo print_r( $linkArray, true );
echo "</pre>";
?>

volgens mij moet het zo wel lukken ?
Klopt bijna helemaal.

Alleen moet er nu ook nog de kolom voorkomen.
het is gelukt :-)

Dank jullie wel allemaal

while($link = mysql_fetch_assoc($res ))
{
$linkArray[$link['kolom']][$link['categorie_id']][] = $link;
}
Tip: Gebruik de innoDB-engine van MySQL en niet MyIsam. Met innoDB kun je foreignkey's gebruiken en kun je dus een onderling verband gaan leggen tussen de verschillende tabellen. Met MyIsam is dit onmogelijk.

In dit geval komt er een foreignkey op categorie_id int(10) met het id uit de tabel categorie. Wil je dan een categorie verwijderen, dan zul je eerst de bijbehorende links moeten verwijderen of moeten koppelen aan een andere categorie. Anders mislukt de DELETE-query van deze categorie. Hierbij ga ik er even van uit dat iedere link is gekoppeld aan 1 categorie en dat je CASCADE gebruikt bij een UPDATE en een DELETE. Zie verder de MySQL-handleiding

Reageren