koppeling bookmark aan tags (select probleem?)
Ik ben een bookmarkingssite aan het maken en heb al best veel kennis van php en sql, maar ik kom altijd in de problemen met het koppelen van tabellen. In het volgende stukje code zie je een select staan en dit werkt niet goed.
De code staat in een iets grotere while lus die alle bookmarks onder elkaar laat zien. Dit stukje code moet er voor zorgen dat de bijbehorende tags hieronder komen te staan. Nu krijg ik alleen alle tags ipv de bijbehorende.
voorbeeld:
[bookmarklink]
[tag1][tag2][tag3][tag4][tag5]
Ik heb drie genormaliseerde tabellen en die gaan als volgt
[bookmarks]
bookmark_id
bookmark_url
bookmark_naam
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
tag_id
tag_naam
[bookmarks_tags] (koppeling)
bookmark_id
tag_id
de id's van bookmarks en tags zijn uniek..
<?php
// zoekt alle tags op van de getoonde bookmark
$result2 = mysql_query("SELECT * FROM bookmarks_tags bt, bookmarks b, tags t WHERE bt.tag_id = t.tag_id AND b.bookmark_id = bt.bookmark_id");
while ($row2 = mysql_fetch_array($result2)) {
echo "<a href=\"index.php?t={$row2['tag_id']}\">{$row2['tag_naam']}</a>";
}
?>
ik hoop dat jullie mij kunnen helpen
Gewijzigd op 01/01/1970 01:00:00 door Ren
bookmark1 - tag1
bookmark1 - tag2
bookmark1 - tag3
bookmark2 - tag1
bookmark3 - tag1
bookmark3 - tag2
De SQL query die je hiervoor gebruik is de volgende:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
b.bookmark_naam,
t.tag_naam
FROM
bookmarks b
LEFT JOIN
bookmarks_tags bt
ON bt.bookmark_id = b.bookmark_id
INNER JOIN
tags t
ON t.id = bt.tag_id
ORDER BY
b.bookmark_naam ASC
b.bookmark_naam,
t.tag_naam
FROM
bookmarks b
LEFT JOIN
bookmarks_tags bt
ON bt.bookmark_id = b.bookmark_id
INNER JOIN
tags t
ON t.id = bt.tag_id
ORDER BY
b.bookmark_naam ASC
Vervolgens ga je deze resultaten van deze query fetchen in een while loop. Daarbij houd je in een variabele bij wat de vorige bookmark was die je gehad hebt. Als die verschilt van je huidige bookmark, echo je de naam van de bookmark. Daarnaast echo je altijd de tags die bij de bookmarks horen...
Tenslotte nog iets over de naamgeving van je kolommen. Het is overbodig om in een 'bookmarks' tabel je kolommen ook nog eens te gaan prefixen met 'bookmark'. Het mag immers voor zich spreken dat het 'id' uit een 'bookmarks' tabel het id van een bookmark is...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
// geeft de bookmarks weer
$result = mysql_query("SELECT * FROM bookmarks");
while ($row = mysql_fetch_array($result)) {
echo "<h1><a href=\"{$row['bookmark_url']}\">{$row['bookmark_naam']}</a></h1>";
// zoekt alle tags op van de getoonde bookmark
$result1 = mysql_query("SELECT t.tag_id, t.tag_naam FROM bookmarks b LEFT JOIN bookmarks_tags bt ON bt.bookmark_id = b.bookmark_id INNER JOIN tags t ON t.tag_id = bt.tag_id");
while ($row1 = mysql_fetch_array($result1)) {
echo "<a href=\"index.php?t={$row1['tag_id']}\">{$row1['tag_naam']}</a>";
}}
?>
// geeft de bookmarks weer
$result = mysql_query("SELECT * FROM bookmarks");
while ($row = mysql_fetch_array($result)) {
echo "<h1><a href=\"{$row['bookmark_url']}\">{$row['bookmark_naam']}</a></h1>";
// zoekt alle tags op van de getoonde bookmark
$result1 = mysql_query("SELECT t.tag_id, t.tag_naam FROM bookmarks b LEFT JOIN bookmarks_tags bt ON bt.bookmark_id = b.bookmark_id INNER JOIN tags t ON t.tag_id = bt.tag_id");
while ($row1 = mysql_fetch_array($result1)) {
echo "<a href=\"index.php?t={$row1['tag_id']}\">{$row1['tag_naam']}</a>";
}}
?>
ten eerste bedankt voor je hulp.
ik heb het nu zo, maar nu worden nog steeds alle tags bij de bookmark toegevoegd omdat ik niet die variabele die jij had aangegeven er bij heb.
Moet ik dan bijvoorbeeld een $count = $count + 1; in de loop zetten? en voor de while lus $count =1;? ik weet niet hoe ik daarna het verschil kan uitrekenen en waar ik deze uitkomst in de select moet zetten om aan te geven om welke tags het gaat.
moet ik dan b.bookmark_id vervangen met $count?
(goed idee trouwens van die id in de kolommen daar had ik nog niet aangedacht. wordt het dan alleen niet verwarrend in de koppelingstabel?
Gewijzigd op 01/01/1970 01:00:00 door Ren
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
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
<?php
$sQuery = "
SELECT
b.bookmark_naam,
t.tag_naam
FROM
bookmarks b
LEFT JOIN
bookmarks_tags bt
ON bt.bookmark_id = b.bookmark_id
INNER JOIN
tags t
ON t.id = bt.tag_id
ORDER BY
b.bookmark_naam ASC
";
if(!$rResult = mysql_query($sQuery))
{
trigger_error(mysql_error().'<br>In query: '.$sQuery);
}
else
{
$sPrevBookmark = '';
while($aRow = mysql_fetch_assoc($rResult))
{
if($aRow['bookmark_naam'] != $sPrevBookmark)
{
echo '<br>'.$aRow['bookmark_naam'].'<br>';
$sPrevBookmark = $aRow['bookmark_naam'];
}
echo $aRow['tag_naam'].'<br>';
}
}
?>
$sQuery = "
SELECT
b.bookmark_naam,
t.tag_naam
FROM
bookmarks b
LEFT JOIN
bookmarks_tags bt
ON bt.bookmark_id = b.bookmark_id
INNER JOIN
tags t
ON t.id = bt.tag_id
ORDER BY
b.bookmark_naam ASC
";
if(!$rResult = mysql_query($sQuery))
{
trigger_error(mysql_error().'<br>In query: '.$sQuery);
}
else
{
$sPrevBookmark = '';
while($aRow = mysql_fetch_assoc($rResult))
{
if($aRow['bookmark_naam'] != $sPrevBookmark)
{
echo '<br>'.$aRow['bookmark_naam'].'<br>';
$sPrevBookmark = $aRow['bookmark_naam'];
}
echo $aRow['tag_naam'].'<br>';
}
}
?>
Quote:
Uiteraard gebruik je in de koppeltabel wel duidelijke namen. Daar is het namelijk niet direct duidelijk om welk id het zou gaan...wordt het dan alleen niet verwarrend in de koppelingstabel?
Het heeft allemaal gewerkt, heel erg bedankt. Mijn probleem is opgelost
ik heb al een inlogsysteem, zoekfunctie, admin en verscheidene bookmarkfilters gemaakt sinds gister, maar nu bijt me dit weer van achter in me rug.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php // geeft de bookmarks weer + eigen tags
$result = mysql_query("SELECT b.bookmark_naam, b.bookmark_url, t.tag_id, t.tag_naam FROM bookmarks b LEFT JOIN bookmarks_tags bt ON bt.bookmark_id = b.bookmark_id INNER JOIN tags t ON t.tag_id = bt.tag_id");
$prevbookmark = "";
while($row = mysql_fetch_assoc($result)) {
if($row['bookmark_naam'] != $prevbookmark)
{
echo "<h2><a href=\"{$row['bookmark_url']}\">{$row['bookmark_naam']}</a></h2>tags: ";
$prevbookmark = $row['bookmark_naam'];
}
echo "<span>";
echo "<a href=\"index.php?t={$row['tag_id']}\">{$row['tag_naam']} </a>";
echo "</span>";
}?>
$result = mysql_query("SELECT b.bookmark_naam, b.bookmark_url, t.tag_id, t.tag_naam FROM bookmarks b LEFT JOIN bookmarks_tags bt ON bt.bookmark_id = b.bookmark_id INNER JOIN tags t ON t.tag_id = bt.tag_id");
$prevbookmark = "";
while($row = mysql_fetch_assoc($result)) {
if($row['bookmark_naam'] != $prevbookmark)
{
echo "<h2><a href=\"{$row['bookmark_url']}\">{$row['bookmark_naam']}</a></h2>tags: ";
$prevbookmark = $row['bookmark_naam'];
}
echo "<span>";
echo "<a href=\"index.php?t={$row['tag_id']}\">{$row['tag_naam']} </a>";
echo "</span>";
}?>
ik hoop dat het niet teveel gevraagd is om even naar de code te kunnen kijken voor een oplossing van de dubbele bookmarks in het overzicht.