2 votes

Créer une liste de notifications intelligente

Scénario

Un site web d'images qui possède des fonctions de base telles que le téléchargement, les commentaires, l'appréciation, le suivi des utilisateurs, etc.

Maintenant, j'ai un système de notification de base que j'ai construit très rapidement et qui, en gros, lorsqu'un événement se produit, comme un téléchargement ou autre, il est inséré dans la base de données de l'entreprise. notifications et a ensuite un read colonne qui détermine si l'utilisateur l'a vu ou non, simple.

L'exemple actuel de sortie serait quelque chose comme ceci,

John Doe liked Picture of my cat.
Sarah Doe liked Picture of my cat.
Adam Doe liked Picture of my cat.
Sarah Doe liked Picture of my cat.
Henry Doe is now following you.

Ce qui, en gros, est classé par heure d'entrée.

Ce que j'aimerais réaliser, c'est quelque chose de similaire à ce qui suit,

4 users liked Picture of my cat.
Henry Doe is now following you.

J'essaie de mettre à profit mes connaissances moyennes de PHP et le meilleur moyen auquel je pense est de faire quelque chose comme ceci.

$query = mysql_query("SELECT * FROM `notifications` WHERE `read` = '0' LIMIT 20");
$likes = array();
$following = array();
while($row = mysql_fetch_array($query)){

    if($row['type'] == "like"){

        array_push($likes,$row['id']);

    }   elseif($row['type'] == "following"){

        array_push($following,$row['id']);

    }

}

Et ensuite les trier pour les afficher correctement. Mais cela semble encore très compliqué.

Par ailleurs, si quelqu'un a une suggestion à faire, ce serait une bonne idée de mettre en place un algorithme qui les regrouperait même si elles ne se suivent pas directement, par exemple à 5 minutes d'intervalle mais avec des notifications différentes entre les deux.

John Doe liked Picture of my cat.
John Doe is now following you.
Sarah Doe liked Picture of my cat.
Sarah is now following you.

Sur

2 People liked Picture of my cat.
2 New Users are now following you.

1voto

Emir Akaydın Points 3969

Je pense que la meilleure solution consiste à utiliser GROUP BY en SQL pas à PHP côté. Vous devez regrouper les résultats par type d'événement. S'il n'y a qu'un seul résultat, il suffit de l'afficher en utilisant une deuxième requête. S'il y a plus d'un résultat, il suffit d'afficher COUNT(*) comme vous le souhaitiez.

EDIT : Exemples.

SELECT event_type, COUNT(*) AS count FROM `notifications` WHERE `read` = '0' GROUP BY event_type

result:
event_type  count
----------  -----
4           4
6           2
9           1
12          2

Vous pouvez ensuite lancer une deuxième requête pour les événements qui n'apparaissent qu'une seule fois.

SELECT * FROM `notifications` WHERE `read` = '0' AND `event_type` = '9'

bien entendu, vous devez également modifier leur statut de lecture à la fin de l'opération

UPDATE `notifications` SET `read` = '1' WHERE `read` = '0'

Il ne s'agit là que d'exemples rapidement préparés. Vous devez vous occuper des cas particuliers, mettre à jour uniquement les entrées indiquées, etc.

J'ai utilisé event_type comme champ. Je crois que vous avez un champ comme celui-ci. Vous devriez renommer cette partie en fonction de la structure de votre base de données.

0voto

Ikstar Points 153

Si l'on prend l'exemple de FB, les notifications sont traitées indépendamment du nombre. Si nous cliquons sur le nombre de likes sur FB, nous obtenons un retour d'information sur les personnes qui ont aimé, le compte n'est donc qu'un support pour les éléments traités.

Lorsque vous procédez à un traitement, tenez le compte des notifications

mysql_query("SELECT * FROM `notifications` WHERE `read` = '0' AND 'date_added' > {SOMETIMEEXPRESSION} GROUP BY type LIMIT 20");
while($row = mysql_fetch_array($query)) {
if ($curType != $row['type']) {
    $curType = $row['type'];
    $curCount = 0;
    //Other Type switch conditions
 }
//    do the magic that you wish to do for the type.
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X