2017-09-15 11 views
-1

「type」および「message_id」列に同じ値を持ち、連続している通知をグループ化するにはどうすればよいですか?
私の「通知」テーブルの構造は次のとおりです。フィールド内の同じ値を持つ継続的な通知グループ化

[id |著者|日時|タイプ|メッセージID |私はGROUP BY機能で試してみましたが、これはお互いに連続しているものだけでなく、すべてのレコードをグループ化しています。

GROUP BYで、私は何も達成していないので、今私が持っているすべては、単純なクエリです:

$notifications = mysql_query("SELECT * FROM notifications WHERE notification_to = '$session_row_id' ORDER BY id DESC LIMIT 20", $connection); 

をそしてレコードを一覧表示する:

while($rows = mysql_fetch_array($notifications)) { ... } 

は、これは私が今持っているものです。

USER1 followed you 
USER2 followed you 
USER3 shared your message[ID:10] 
USER4 followed you 
USER5 shared your message[ID:20] 
USER6 shared your message[ID:20] 
USER7 shared your message[ID:30] 

そして、何私が取得したいことはこれです:

Twitterの通知のよう
USER1 and 1 more followed you 
USER3 shared your message[ID:10] 
USER4 followed you 
USER5 and 1 more shared your message[ID:20] 
USER7 shared your message[ID:30] 

view screenshot

+1

私はこの質問にSQLまたはmysqlタグを付けるべきだと思っています。また、私たちにいくつかのコードを表示して、何を試しましたか?あなたは何を期待していますか?何を手に入れていますか? .. – Naruto

+0

今私が持っているのは単純なクエリです。なぜならGROUP BYでは何も達成していないからです。私はこれを持っています:$ notifications = mysql_query( "SELECT * FROM通知where_reference_to = '$ session_row_id' ORDER BY id DESC LIMIT 20、$ connection); – Gabri

+0

レコードを一覧表示するには:while($ rows = mysql_fetch_array($ notifications)){...} – Gabri

答えて

0
$notifications = mysql_query("SELECT * FROM notifications WHERE notification_to = '$session_row_id' ORDER BY id DESC LIMIT 20", $connection); 

$last_notification = false; 
$grouped_notifications = array(); 
while($row = mysql_fetch_array($notifications)) { 
    if($last_notification && $row['message_id'] == $last_notification['message_id'] && $row['type'] == $last_notification['type']){ 
     $last_notification['plus']++; 
    }else{ 
     $row['plus'] = 0; 
     $grouped_notifications[] = $row; 
     $last_notification = &$grouped_notifications[count($grouped_notifications)-1]; 
    } 
} 

foreach($grouped_notifications as $notification){ 
    echo $notification['author']; 
    if($notification['plus']>0){ 
     echo ' and '.$notification['plus'].' more'; 
    } 
    echo ' has '.$notification['type']; 
} 

私たちは、すべての通知を取得し、グループ彼らはPHPを使用して(それは簡単です)。最後に処理した通知が現在の通知と同じであるかどうかを確認し、そうであればユーザー数に1を加算します。それ以外の場合は、新しい通知を作成し、last_notificationにリンクします。

その後、私たちは1人以上のユーザーがいるかどうかを確認する通知をエコーし​​ます。省略したようにタイプをecho'dして、どの変数を使用するべきか、何かを教えてください。

+0

ありがとう!私はちょうどあなたのコードをテストし、それが正しく動作するようです。 – Gabri

+0

完璧に動作します。グループ化されたすべての著者を表示するにはどうしたらいいですか?今は最後のものだけです。私は他のものも見せたいと思っていました。 – Gabri

+0

あなたは他人を見せたかったと言ったことはありません...それらを「他人」のリストなどに追加して使用する必要があります。 – Salketer

関連する問題