JOINS
(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
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
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 ;
`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
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
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 ;
`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
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
$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());
("
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
Gewijzigd op 01/01/1970 01:00:00 door Koen Bokern
Op zo'n manier. Dan kan je ze bijvoorbeeld weergeven door $row['forumbericht'] te doen.
Succes!
Sorry als ik er naast zit, ik ken niks van JOINS maar ik heb zelf nog nooit problemen gehad met reacties koppelen aan een topic oid.
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.
Quote:
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.
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.
Als ik deze neem:
Moet ik deze gebruiken
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
while($ikbenvariabel = mysql_fetch_array($ikbeneenquery))
{
$topic_bericht = $ikbenvariabel['topicbericht'];
$forum_bericht = $ikbenvariabel['forumbericht'];
// nu deze variabelen weergeven.
}
{
$topic_bericht = $ikbenvariabel['topicbericht'];
$forum_bericht = $ikbenvariabel['forumbericht'];
// nu deze variabelen weergeven.
}
Dit is dan even heel zwart wit gezegd, maar klopt dit ongeveer?
Gewijzigd op 01/01/1970 01:00:00 door Cedric
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
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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>");
{
$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>");
Ik hoop dat iemand me hierbij nog kan helpen
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.
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.
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
dit heb ik geprobeerd
dit heb ik geprobeerd
Ook heb ik RIGHT en INNER geprobeerd.
Nu even de tut lezen
Das wel raar, probeer eens een OUTER JOIN dan..
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OUTER JOIN forum_reacties ON forum_topics.id = forum_reacties.topic_key WH' at line 4
echo je sql eens en zet deze eens mooi geformateerd hier neer tussen code tags
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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
OUTER 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());
?>
$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
OUTER 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());
?>
Als dat niet mooi is :)
Gewijzigd op 01/01/1970 01:00:00 door Koen Bokern
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
$query3="
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
LEFT 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
"
echo $query3;
$res=mysql_query($sql) or die(mysql_error());
?>
$query3="
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
LEFT 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
"
echo $query3;
$res=mysql_query($sql) or die(mysql_error());
?>
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
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 LEFT JOIN
forum_reacties ON forum_topics.id = forum_reacties.topic_key WHERE
forum_topics.id = '205' AND forum_reacties.topic_key = '205' ORDER BY
forum_reacties.id ASC Query was empty
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 LEFT JOIN
forum_reacties ON forum_topics.id = forum_reacties.topic_key WHERE
forum_topics.id = '205' AND forum_reacties.topic_key = '205' ORDER BY
forum_reacties.id ASC Query was empty
Gewijzigd op 01/01/1970 01:00:00 door Koen Bokern
Edit:
Oke. Maar het werkt nog steeds niet. Ik vind het maar wazig...
Oke. Maar het werkt nog steeds niet. Ik vind het maar wazig...
Gewijzigd op 01/01/1970 01:00:00 door Koen Bokern
Wat doet die Query was empty daar???
Vroeg ik me ook al af. Ik zou eigenlijk niet weten hoe ik dit moet aanpakken.
En wat gebeurt als je
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 LEFT JOIN
forum_reacties ON forum_topics.id = forum_reacties.topic_key WHERE
forum_topics.id = '205' AND forum_reacties.topic_key = '205' ORDER BY
forum_reacties.id ASC
invoert in phpmyadmin?
id
schrijver
onderwerp
categorie
topicbericht
id
topic_key
schrijver
categorie
forumbericht
Elk hiervan is gevuld met de juiste waarde. Misschien is het geen SQL probleem maar eerder een PHP probleem