Even een vraagje rond de mysql joins.
Inmiddels weet ik al hoe ik zo een join samenstel maar het probleem is echter dat het voor mijn toepassing niet echt zal werken daar het id nummer in de drie tabellen gelijk moet zijn met elkaar. In de WHERE clause kan je dit slechts van twee tabellen terwijl ik eigenlijk wil dat het id nummer van de drie tabellen gelijk moet zijn, en als die in een tabel niet voorkomt dat hij alsnog wordt opgenomen in de lijst, is dit mogelijk?
wel drie tabellen van drie projecten
elke tabel heeft een gemeenschappelijk id nummer, dit id nummer hangt vast aan een gebruiker echter komt die niet in elke tabel voor:
CREATE TABLE `project1` (
`id` varchar(150) NOT NULL default '',
`naam` varchar(250) NOT NULL default '',
`land` varchar(100) NOT NULL default '',
`punten` int(15) unsigned NOT NULL default '0',
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
dit dus zo'n drie maal dezelfde structuur per project
de bedoeling is dat ik uit de drie tabellen de gevens kan halen voor weer te geven hoeveel een gebruiker in totaal heeft bij de drie projecten en per project toon hoeveel deze persoon heeft, echter is het zo dat niet elke gebruiker in één van die tabellen voorkomt, een gebruiker kan dus ook maar in één project zitten en een andere gebruiker in twee of drie projecten. de bedoeling is dus dat ik die samenkrijg door middel van een query
Je kunt beter een id in je project tabel hebben met een user_id er in.
Dat kun je met een left join doen. dan krijg je zoiets:
<?php
SELECT users.*, project1.punten AS punten1, project2.punten AS punten 2, project3.punten AS punten3, punten1 + punten2 + punten3 AS totaal FROM users LEFT JOIN project1 ON (project1.user_id = users.id) LEFT JOIN project2 ON (project2.user_id = users.id) LEFT JOIN project3 ON (project3.user_id = users.id)
Als je allemaal losse tabellen hebt zonder enige relatie met andere tabellen, dan is het niet mogelijk om de juiste gegevens er uit te halen.
Dan kan je beter weer terug gaan naar het ontwerp en opnieuw beginnen met normaliseren.
Houd er rekening mee dat een sleutel niet een 'id'-veld moet zijn, maar dat dat ook een combinatie kan zijn van verschillende kolommen!
Sterker nog, door enkel het gebruik van een id veld met auto nummering stel je de database open voor redundantie. En das nou precies wat je wilt voorkomen.
een id in de prjecttabel met een userid, er is een userid extra ingevoegd maar per project heeft een bepaalde user een ander user id afhankelijk van het project
het enige wat bij alles hetzelfde blijft is het gemeenschappelijk id over de diverse projecten
de releatie tussen andere tabellen is het gemeenschappelijk id dat overal in voorkomt
maar dan vallen de andere leden uit de boot want niet elk lid zit in een bepaald project en we dienen van elk lid die in een project zit de resultaten op het scherm tonen.
nee ontwerp opnieuw maken behoort niet tot de mogelijkheden aangezien die projecten elk op een andere server staan en de samengevatte data in de tabellen geplaatst worden
het is onmohelijk om alles in één projecttabel te steken :s