mysql brainteaser (voor mij altans)
1.) tabel met deelnemers.
2.) tabel met evenementen.
de deelnemers kunnen een evenement reserveren.
In de deelnemers tabel staat dan ook welke evenement ze reserveren en met hoeveel mensen.
in de evenementen tabel staat de maximale aantal delnemers bijvoorbeeld tien.
(Het is zelfs zo dat er twee reserveringen mogelijk zijn met hun eigen maximale aantal deelnemers maxA en maxB
die hebben elk hun eigen prijs categorie.)
Nu wil ik op de reserverings pagina alleen de datums laten zien die nog niet volgeboekt zijn.
zo niet dan wil ik dus de datum laten zien met hoeveel plekken er nog open zijn.
zo kunnen mensen dus niet en datum kiezen die al volgeboekt zijn en niet voor vier mensen reserveren terwijl er nog maar twee plekken over zijn.
Ik kan dit op mijn manier doen maar dat is wellicht nog al omslachtig. gezien mijn geringe kennis van het mysql taaltje.
zou je hier kunnen werken met inner/outer joins?
en hoe gaat dat dan?
de twee tabbelen hebben een relatie op de volgende velden:
deelnemers: id -> evenement_id
thanks...
Auke.
EDIT:
ik heb het idee dat het gewoon een redelijk simpele query wordt zoals:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$query = "SELECT * FROM evenementen";
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
$max_aantal = $row['max_aantal'];
//etc.
$query = "SELECT * FROM deelnemers WHERE evenement_id = ".$evenement_id;
$result2 = mysql_query($query);
$row2 = mysql_fetch_array($result2);
$aantal_deelnemers = mysql_num_rows($result2);
if ($aantal_deelnemers != $max_aantal)
{
//echo de evenementen
}
}
?>
$query = "SELECT * FROM evenementen";
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
$max_aantal = $row['max_aantal'];
//etc.
$query = "SELECT * FROM deelnemers WHERE evenement_id = ".$evenement_id;
$result2 = mysql_query($query);
$row2 = mysql_fetch_array($result2);
$aantal_deelnemers = mysql_num_rows($result2);
if ($aantal_deelnemers != $max_aantal)
{
//echo de evenementen
}
}
?>
EDIT: je had het al gepost, je moet zelf nog even de variabelen e.d. aanpassen. maar in principe zou dit wel moeten werken denk ik.
Gewijzigd op 06/03/2006 17:34:00 door Stefan van Iwaarden
Dumpje::
CREATE TABLE `evenementen` (
`id` tinyint(12) NOT NULL auto_increment,
`datum` date NOT NULL default '0000-00-00',
`maxA` tinyint(5) NOT NULL default '0',
`maxB` tinyint(5) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
CREATE TABLE `deelnemers` (
`id` int(12) NOT NULL auto_increment,
`voornaam` varchar(75) NOT NULL default '',
`achternaam` varchar(110) NOT NULL default '',
`adres` varchar(150) NOT NULL default '',
`woonplaats` varchar(75) NOT NULL default '',
`postcode` varchar(8) NOT NULL default '',
`telefoon` varchar(10) NOT NULL default '',
`email` varchar(110) NOT NULL default '',
`deelnemers` tinyint(4) NOT NULL default '0',
`evenement_id` int(12) NOT NULL default '0',
`datum` datetime NOT NULL default '0000-00-00 00:00:00',
`confirm` enum('y','n') NOT NULL default 'y',
PRIMARY KEY (`id`),
KEY `evenement_id` (`evenement_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Zelf ben ik ook begonnen met organiseren van een en ander en dit zou ook handig bij mij van pas komen :)
echter... wat ik me afvroeg of ik dit ook in één query zou kunnen doen.
dus de twee tabbelen verbinden.
ik kan me de volgende zin voorstellen.
ik groepeer alle deelnemers per datum (evenement_id) en tel daarvan de totale aantal deelnemers bij elkaar op.
(deelnemers) ik vergelijk dan de totale aantal reserveringen met de optelling van veld maxA en maxB.
is het maximale aantal inschrijvers nog niet berijkt dan geef ik de fdatum weer.
ik echo in dat geval dus ; niet volgeboekte datum - nog te reserveren plaatsen.
kan dit in één enkele query?
als dit kan zou ik die graag willen leren kennen.
zodat ik weer wat geleerd heb en efficientere code kan maken.
anders leer ik niks bij en blijf dezelfde codes gebruiken zonder te kijken naar alternatieven
Thanks!
ik weet in ieder geval geen code om dat korter te krijgen omdat je immers bij ieder evenement moet controleren hoeveel deelnemers er zijn (de query in de while).