Het weergeven van activiteiten door elkaar en op datum gesorteerd
Maar ik zit met een probleempje. Hij wil wel alle activiteiten weergeven maar dan sorteerd die ze op persoon.
Even kort uitgelegd: Er word een rij van activiteiten/updates weergeven van Jan en daar onder weer een rij van activiteiten/updates van Henk en ga zo maar door. Dit is niet de bedoeling en dit heeft hyves en facebook ook niet. Want hier bij moet de persoon eerst helemaal naar onder scrollen om degene's activiteiten te kunnen bekijken als die helemaal onderaan staat.
Dus wat ik eigenlijk wil is dat de alle activiteiten/updates worden weergeven van alle vrienden door elkaar maar dan ook op datum gesorteerd zoals hyves en facebook.
Maar hoe krijg ik dit voor elkaar?
Dit is mijn code:
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$i = 0;
$selectFriendsID = mysql_query('SELECT friendID FROM friends WHERE userID = "'.$_SESSION['naam'].'" ') or trigger_error(mysql_error());
$g = mysql_fetch_assoc($selectFriendsID);
$updateID = mysql_query('SELECT id, naam, message, date FROM updates WHERE naam = "'.$g['friendID'].'" ') or trigger_error(mysql_error());
$p = mysql_fetch_assoc($updateID);
?>
$i = 0;
$selectFriendsID = mysql_query('SELECT friendID FROM friends WHERE userID = "'.$_SESSION['naam'].'" ') or trigger_error(mysql_error());
$g = mysql_fetch_assoc($selectFriendsID);
$updateID = mysql_query('SELECT id, naam, message, date FROM updates WHERE naam = "'.$g['friendID'].'" ') or trigger_error(mysql_error());
$p = mysql_fetch_assoc($updateID);
?>
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$selectFriends = mysql_query('SELECT friendID FROM friends WHERE userID = "'.$_SESSION['naam'].'" ') or trigger_error(mysql_error());
while($f = mysql_fetch_assoc($selectFriends)) {
$a = mysql_query('SELECT id, naam, message, date FROM updates WHERE naam = "'.$f['friendID'].'" ORDER BY date DESC ') or trigger_error(mysql_error());
$b = mysql_query('SELECT imagelocation, voornaam, achternaam FROM leden WHERE naam = "'.$f['friendID'].'" ') or trigger_error(mysql_error());
$z = mysql_fetch_assoc($b);
while($q = mysql_fetch_assoc($a)){
$i++;
echo '<img src="'.$z['imagelocation'].'" style="width: 40px; height: 40px; float: left; margin-right: 5px;" />';
echo '<h4>'.$z['voornaam'].' '.$z['achternaam'].'</h4>';
echo '<span style="font-size: 10px;"><p>'.$q['date'].'</p></span>';
echo '<hr />';
echo $q['message'].'<br />';
echo '<span style="font-size: 11px;">Nice - <a href="?mode=reageren&&naam='.$q['naam'].'&&id='.$q['id'].'">Reageren - <a href="?id='.$q['id'].'">Reacties</a> - Delen</span><br />';
}// einde van de while statement: $q
}// einde van de while statement: $f
?>
$selectFriends = mysql_query('SELECT friendID FROM friends WHERE userID = "'.$_SESSION['naam'].'" ') or trigger_error(mysql_error());
while($f = mysql_fetch_assoc($selectFriends)) {
$a = mysql_query('SELECT id, naam, message, date FROM updates WHERE naam = "'.$f['friendID'].'" ORDER BY date DESC ') or trigger_error(mysql_error());
$b = mysql_query('SELECT imagelocation, voornaam, achternaam FROM leden WHERE naam = "'.$f['friendID'].'" ') or trigger_error(mysql_error());
$z = mysql_fetch_assoc($b);
while($q = mysql_fetch_assoc($a)){
$i++;
echo '<img src="'.$z['imagelocation'].'" style="width: 40px; height: 40px; float: left; margin-right: 5px;" />';
echo '<h4>'.$z['voornaam'].' '.$z['achternaam'].'</h4>';
echo '<span style="font-size: 10px;"><p>'.$q['date'].'</p></span>';
echo '<hr />';
echo $q['message'].'<br />';
echo '<span style="font-size: 11px;">Nice - <a href="?mode=reageren&&naam='.$q['naam'].'&&id='.$q['id'].'">Reageren - <a href="?id='.$q['id'].'">Reacties</a> - Delen</span><br />';
}// einde van de while statement: $q
}// einde van de while statement: $f
?>
Je hebt nu twee aparte query's. Vermoed dat je beter naar join kunt kijken. Dan heb je 1 query die je kunt sorteren.
Code (php)
1
2
3
4
5
2
3
4
5
SELECT u.id, u.naam, u.date, u.message, l.imagelocation, l.voornaam, l.achternaam
FROM updates AS u
LEFT JOIN ON friends AS f WHERE u.naam = f.id
LEFT JOIN ON leden AS l WHERE u.naam = l.id
ORDER BY u.date ASC
FROM updates AS u
LEFT JOIN ON friends AS f WHERE u.naam = f.id
LEFT JOIN ON leden AS l WHERE u.naam = l.id
ORDER BY u.date ASC
(code niet gecheckt)
Dit is de code:
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
session_start();
include('config.php');
$query = mysql_query('SELECT * FROM friends JOIN updates ON friends.userID = updates.naam ORDER BY date DESC') or trigger_error(mysql_error());
while($q = mysql_fetch_array($query) ) {
echo $q['naam'].'<br />';
echo $q['date'].'<br />';
echo $q['message'].'<br /><br />';
}
?>
session_start();
include('config.php');
$query = mysql_query('SELECT * FROM friends JOIN updates ON friends.userID = updates.naam ORDER BY date DESC') or trigger_error(mysql_error());
while($q = mysql_fetch_array($query) ) {
echo $q['naam'].'<br />';
echo $q['date'].'<br />';
echo $q['message'].'<br /><br />';
}
?>
@Remco: klopt. Je moet LEFT of RIGHT of INNER gebruiken, anders krijg je het cartesisch product van je tabellen.
Nu ik jou code even heb aangepast naar de goede kolommen in de table(ik weet niet of ik het goed gedaan heb want heb nooit eerder met JOIN query's gewerkt) krijg ik een error.
Dit is de code:
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
session_start();
include(config.php);
$query = mysql_query('SELECT u.id, u.naam, u.date, u.message, f.friendID, f.userID, l.imagelocation, l.voornaam, l.achternaam, l.naam FROM updates AS u
LEFT JOIN ON friends AS f WHERE u.naam = f.friendID
LEFT JOIN ON leden AS l WHERE u.naam = l.naam
ORDER BY u.date DESC') or trigger_error(mysql_error());
while($q = mysql_fetch_assoc($query) ) {
echo $q['naam'].'<br />';
echo $q['date'].'<br />';
echo $q['message'].'<br /><br />';
}
?>
session_start();
include(config.php);
$query = mysql_query('SELECT u.id, u.naam, u.date, u.message, f.friendID, f.userID, l.imagelocation, l.voornaam, l.achternaam, l.naam FROM updates AS u
LEFT JOIN ON friends AS f WHERE u.naam = f.friendID
LEFT JOIN ON leden AS l WHERE u.naam = l.naam
ORDER BY u.date DESC') or trigger_error(mysql_error());
while($q = mysql_fetch_assoc($query) ) {
echo $q['naam'].'<br />';
echo $q['date'].'<br />';
echo $q['message'].'<br /><br />';
}
?>
Gewijzigd op 21/07/2012 12:11:02 door Remco van Akker
Het zou best helpen als je die error er ook bij zou vermelden ;-)
Notice: 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 'ON friends AS f WHERE u.naam = f.friendID LEFT JOIN ON leden AS l WHERE u.naam =' at line 2 in /home/webprijsj/domains/mybuddies.nl/public_html/test2.php on line 12
Nee dan heb je nog steeds de error.
Ziet er ook raar uit.... een Naam (STRING) koppelen aan een FriendID (ID = INTEGER)
En een JOIN werkt niet met een WHERE, maar met ON!
En wel op een andere plek dan het nu staat.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$query = mysql_query('SELECT u.id, u.naam, u.date, u.message, f.friendID, f.userID, l.imagelocation, l.voornaam, l.achternaam, l.naam FROM updates AS u
LEFT JOIN friends AS f ON ( u.naam = f.friendID)
LEFT JOIN leden AS l ON ( u.naam = l.naam)
ORDER BY u.date DESC') or trigger_error(mysql_error());
?>
$query = mysql_query('SELECT u.id, u.naam, u.date, u.message, f.friendID, f.userID, l.imagelocation, l.voornaam, l.achternaam, l.naam FROM updates AS u
LEFT JOIN friends AS f ON ( u.naam = f.friendID)
LEFT JOIN leden AS l ON ( u.naam = l.naam)
ORDER BY u.date DESC') or trigger_error(mysql_error());
?>
Toevoeging op 21/07/2012 12:51:08:
Jan Koehoorn op 21/07/2012 12:36:54:
Eerder dit:
Quote:
SELECT u.id, u.naam, u.date, u.message, l.imagelocation, l.voornaam, l.achternaam, l.naam
FROM updates AS u
LEFT JOIN friends AS f ON u.naam = f.friendID
LEFT JOIN leden AS l ON u.naam = l.naam
ORDER BY u.date ASC
FROM updates AS u
LEFT JOIN friends AS f ON u.naam = f.friendID
LEFT JOIN leden AS l ON u.naam = l.naam
ORDER BY u.date ASC
Edit: en gebruik LETTERLIJK mijn laatste voorbeeld.
Gewijzigd op 21/07/2012 13:14:51 door Jan Koehoorn
Quote:
Notice: Unknown column 'l.friendID' in 'on clause' in /home/webprijsj/domains/mybuddies.nl/public_html/test2.php on line 13
EDIT: Het moet geen l.friendID zijn maar l.naam. Maar dan nog als echo't hij de berichten 4 keer uit.
Gewijzigd op 21/07/2012 14:21:36 door Remco van Akker
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
u.id, u.naam, u.date,
u.message, f.friendID, f.userID,
l.imagelocation, l.voornaam,
l.achternaam, l.naam
FROM
friends AS f
JOIN
updates AS u ON u.naam = f.friendID
JOIN
leden AS l ON l.naam = f.friendID
WHERE
f.userID = 'iemand'
ORDER BY
u.date DESC
u.id, u.naam, u.date,
u.message, f.friendID, f.userID,
l.imagelocation, l.voornaam,
l.achternaam, l.naam
FROM
friends AS f
JOIN
updates AS u ON u.naam = f.friendID
JOIN
leden AS l ON l.naam = f.friendID
WHERE
f.userID = 'iemand'
ORDER BY
u.date DESC
Gewijzigd op 21/07/2012 15:23:00 door Ger van Steenderen
Voorbeeld (op Ger's code):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
u.id, u.naam, u.date,
u.message, f.friendID, f.userID,
l.imagelocation, l.voornaam,
l.achternaam, l.naam
FROM
friends AS f
JOIN
updates AS u ON u.naam = f.friendID
JOIN
leden AS l ON l.naam = f.friendID
WHERE
f.userID = 'iemand'
ORDER BY
u.date DESC
GROUP BY u.message
u.id, u.naam, u.date,
u.message, f.friendID, f.userID,
l.imagelocation, l.voornaam,
l.achternaam, l.naam
FROM
friends AS f
JOIN
updates AS u ON u.naam = f.friendID
JOIN
leden AS l ON l.naam = f.friendID
WHERE
f.userID = 'iemand'
ORDER BY
u.date DESC
GROUP BY u.message
Ik heb nu u.message genomen, maar beter op een ID uit die tabel.
Die van jou werkt!
Hartstikke bedankt :)
DISTINCT is dan beter.
Distinct gaat ook niet werken want:
Omdat de basis tabel de verkeerde tabel was in jouw eerdere query en dan ook nog eens een LEFT JOIN op twee tabellen gebruikt wordt krijg je die -naar het lijkt- herhaalde resultaten.
Gewijzigd op 21/07/2012 17:22:08 door Ger van Steenderen