2

シナリオ

アップロード、コメント、いいね、ユーザーのフォローなどの基本的な機能を備えた画像 Web サイト。

これは、基本的に、アップロードなどのイベントが発生したときにnotificationsテーブルに挿入されread、ユーザーがそれを見たかどうかを判断する列があります。

現在の出力例は次のようになります。

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.

これは基本的に入力時間順に並べられています。

今私が達成したいのは、次のようなものです。

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

私は平均的な PHP の知識をこれに取り込もうと懸命に努力していますが、考えられる最善の方法は、このようなことをすることです。

$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']);

    }

}

そして、どういうわけかそれらを正しく表示するように並べ替えます。しかし、それでも非常に複雑なようです。

また、誰かが提案を思いついた場合に考えるべきもう1つのことは、たとえば、5分離れていても通知が異なるなど、直接ではなくてもグループ化するアルゴリズムを用意することをお勧めします。その間に、例えば

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.

の中へ

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

2 に答える 2

1

最善の解決策は、側ではなく使用GROUP BYすることだと思います。イベント タイプ別に結果をグループ化する必要があります。単一の結果がある場合は、2 番目のクエリを使用して単一の結果を表示します。複数の結果がある場合は、意図したとおりに表示してください。SQLPHPCOUNT(*)

編集:例。

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

次に、一度だけ表示されるイベントに対して 2 番目のクエリを実行できます。

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

もちろん、最後に読み取りステータスも変更する必要があります

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

これらは、迅速に準備された例にすぎません。表示されたエントリのみを更新するなど、特別なケースに注意する必要があります。

畑として利用event_typeしました。このようなフィールドがあると思います。データベース構造に従って、その部分の名前を変更する必要があります。

于 2012-08-22T14:03:07.157 に答える
0

FB を例にとると、通知はカウントに関係なく処理されます。FB でいいねの数をクリックすると、誰がそれを気に入ったかのリベートが得られるため、カウントは処理されたアイテムの単なるプレースホルダーです。

処理中に通知の数を保持する

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.
}
于 2012-08-22T14:11:48.713 に答える