Hallo iedereen
(sorry voor de mensen die een leeg topic zien op het begin. Nadeel van een touchpad)
Ik ben bezig met een forum. Daarvoor heb ik twee tabellen aan gemaakt. Een voor de reacties en een voor de Topics.
Voor de topics
CREATE TABLE `forum_topics` (
`id` int(11) NOT NULL auto_increment,
`schrijver` varchar(255) collate latin1_general_ci NOT NULL,
`onderwerp` varchar(255) collate latin1_general_ci NOT NULL,
`categorie` varchar(255) collate latin1_general_ci NOT NULL,
`bericht` text collate latin1_general_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=200 ;
voor de reacties
CREATE TABLE `forum_reacties` (
`id` int(11) NOT NULL auto_increment,
`topic_key` int(11) NOT NULL default '0',
`schrijver` varchar(255) collate latin1_general_ci NOT NULL,
`onderwerp` varchar(255) collate latin1_general_ci NOT NULL,
`categorie` varchar(255) collate latin1_general_ci NOT NULL,
`bericht` text collate latin1_general_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;
Nou zie ik de reacties uit het tabel forum_reacties maar niet het start bericht uit de tabel forum_topics. Wel heb ik uit deze een onderwerp kunnen halen.
De query
$query3 = mysql_query
("
SELECT forum_topics.id, forum_topics.schrijver, forum_topics.onderwerp, forum_topics.categorie, forum_topics.bericht,
forum_reacties.id, forum_reacties.topic_key, forum_reacties.schrijver, forum_reacties.categorie, forum_reacties.bericht
FROM forum_topics
LEFT JOIN forum_reacties
ON forum_topics.id = forum_reacties.topic_key
WHERE forum_topics.id = '". $topicid ."'
AND forum_reacties.topic_key = '". $topicid ."'
") or die(mysql_error());
Ik hoop dat ik duidelijk genoeg ben.
Bij voorbaat dank,
vlerknozem
Het ging niet om de koppeling, zoals de TS al aangaf krijgt hij wel alle reacties te zien, en haalt hij ook keurig het onderwerp op. De koppeling is dus wel goed. Zie ook mijn reactie.
Toelichting op mijn vorige reactie:
Als jij "SELECT tabel.pietje, tabel2.pietje" gebruikt in je query, geeft $row['pietje'] alleen de laatste keer weer. Dat wil zeggen de gegevens in de kolom "pietje" uit tabel2. Wil je dit voorkomen, dan zal je aliassen moeten gebruiken.
Het is hierbij verstandig om aan te geven wat het gegeven inhoud, en uit welke tabel die komt. Dat werkt voor jezelf wel net zo prettig.
Ja, want je geeft er een alias aan, alleen zou ik mysql_fetch_array vervangen door mysql_fetch_assoc. Dat is sneller en is bijna net hetzelfde. ( met array kan je fetchen als een associatieve array, numerieke array of beide, assoc fetcht enkel een associatieve array als ik het goed heb.)
Werkt perfect, en bedankt. Ik denk dat ik de JOINS nu wat beter onder de knie heb.
Echter zat ik nog met twee problemen hierdoor:
1) Topic bericht werdt heel vaak herhaalt, niet goed
2) Mijn kleuren, dus om en om krijgt het topic bericht de zelfde kleur als de eerste reactie.
Dus voor probleem 1 heb ik een $count aan gemaakt met het volgede
if($count < 1)
{
// weergeef het onderwerp bericht
}
Voor probleem 2 heb ik de oplossing ook al...
Dus harstijke bedankt. Nu kan ik eindelijk weer verder :)
Ik start nu een topic met een bericht. Het onderwerp en het bericht worden NIET weergeven. Zodra ik een reactie toevoeg, dan wordt wel alles weergeven. Een deel van mijn bron:
if ( ($categorie) AND ($topic_id) )
{
$topicid = $_GET['topicid'];
include("db_connect.php");
$query3 = mysql_query
("
SELECT forum_topics.id, forum_topics.schrijver, forum_topics.onderwerp, forum_topics.categorie, forum_topics.bericht AS topicbericht,
forum_reacties.id, forum_reacties.topic_key, forum_reacties.schrijver, forum_reacties.categorie, forum_reacties.bericht AS forumbericht
FROM forum_topics
RIGHT JOIN forum_reacties
ON forum_topics.id = forum_reacties.topic_key
WHERE forum_topics.id = '". $topicid ."'
AND forum_reacties.topic_key = '". $topicid ."'
ORDER BY forum_reacties.id ASC
") or die(mysql_error());
// ON forum_topics.id = forum_reacties.topic_key
$cl = 1; // Begin waarde kleuren voor regels
$count = 2;
$kleur1 = "#CFCFCF"; // Onevenkleuren
$kleur2 = "#FFF"; // Even kleuren
print("<table id=\"$count\" border=\"1\" width=\"480\" style=\"width: 480;\" class=\"artheader\">");
}
while($rat = mysql_fetch_array($query3)) // WHILE voor de reacties :P
{
if($cl % 2){$kleur=$kleur2;} else {$kleur = $kleur1; } // Om en om kleuren genereren voor regels.
$topicid = $rat['id'];
$topic_key = $rat['topic_key'];
$categorie = $rat['categorie'];
$onderwerp = $rat['onderwerp'];
$topic_bericht = $rat['topicbericht'];
$reactie_bericht = $rat['forumbericht'];
$schrijver = $rat['schrijver'];
if($count < 3)
{
print("<tr><td colspan=\"2\">$onderwerp</td></tr>");
print("<tr><td width=\"110\" style=\" width: 110;\" valign=\"top\" bgcolor=\"$kleur1\">$schrijver</td>");
print("<td width=\"370 \" style=\"width: 370; \" bgcolor=\"$kleur1\" >$topic_bericht</td></tr>");
}
print("<tr><td width=\"110\" style=\" width: 110;\" valign=\"top\" bgcolor=\"$kleur\">$schrijver</td>");
print("<td width=\"370 \" style=\"width: 370; \" bgcolor=\"$kleur\" >$reactie_bericht</td></tr>");
$cl++;
$count++;
}
print("</table>");
Maak van de RIGHT JOIN eens een LEFT JOIN ;)
[edit]
Als je de tutorial van mij hebt gelezen (onderste in het lijstje met laatste tutorials) dan is je misschien wel duidelijk wat het verschil is. Deze draait de tabellen net andersom:
- waarbij in een LEFT JOIN eerst zal worden gekeken naar de 1st genoemde tabel, de tabel met topics, en van daaruit wordt je koppeling gelegd
En bij een RIGHT JOIN is dit net andersom, dan gaat die kijken naar reacties en zoekt daar het topic bij.
De LEFT JOIN zal voor jou dus het gewenste resultaat geven.
[/edit]