1

私は通知システム (PHP、MySQL ベース) を持っており、次のことをしようとしています: クエリの通知結果は、投稿ごとに無制限にグループ化されますが、time_sent ごとに並べ替えられ、5 回に制限されます (反復ごと)。次に、ajax を使用して、5 つの通知の次の反復セットを表示しました。

基本的に、一度に (セットごとに) 5 つの通知が必要ですが、それぞれについて、グループが 1 つの投稿に関係している場合: 必要なだけ通知を行うことができます。

以下のように表示されます。

  1. ポスト F に関する通知 – 1 日前に送信
  2. 投稿 C に関する最初の通知 – 2 日前に送信
    • 投稿 C に関する 2 回目の通知 – 3 日前に送信
    • 投稿 C に関する 3 回目の通知 – 4 日前に送信
    • 投稿 C に関する 4 回目の通知 – 5 日前に送信
  3. 投稿 Y に関する通知 – 3 日前に送信
  4. 投稿 D に関する最初の通知 – 4 日前に送信
    • 投稿 D に関する 2 回目の通知 – 5 日前に送信
    • 投稿 D に関する 3 回目の通知 – 6 日前に送信
  5. 投稿 Y に関する通知 – 5 日前に送信

投稿 Y に関する新しい通知が送信された場合、これは当然リストの一番上に表示されます。

これは、このグループシステムを実装することを決定する前に、私が始めた方法です:

$notifications_req = mysql_query('SELECT * FROM notifications WHERE user_id = "'.$user_id.'" ORDER BY time_sent DESC LIMIT 5');

そして今、私は道に迷い、このグループ化とロジックによる順序付けに苦労しています。

データベースにはもちろんpost_id列が含まれています。

編集:

通知を並べ替える方法を大幅に変更することになりました。これが私が最終的にやった方法です。最も効率的ではないかもしれませんが、私が望むように動作します:

<?php  $notifications_all_req = mysql_query('SELECT * FROM notifications WHERE user_id = "'.$user_id.'" ORDER BY time_sent DESC');  if(mysql_num_rows($notifications_all_req) > 0){
while($row =  mysql_fetch_assoc($notifications_all_req))
{
    $post_req_ids[] = $row['post_id'];
}
$unique_post_ids = array_unique($post_req_ids);
foreach ($unique_post_ids as $i => $unique_post_id)
{
    ?>      
    <ul id="notifications_ul_<?php echo $i; ?>">
    <?php
    $notifications_req = mysql_query('SELECT * FROM notifications WHERE (user_id = "'.$user_id.'" AND post_id = "'.$unique_post_id.'") ORDER BY time_sent DESC ');
        while($notification =  mysql_fetch_assoc($notifications_req))
        {

        }
        ?>
    </ul>
    <?php
}  }  ?>

$iこのようにして、通知グループ ( を使用) と各グループ内の通知グループの両方の制限を制御できます。また、後者のコードを Ajax でさらに読み込むこともできます。

4

1 に答える 1

1

GROUP BYこれは要約クエリ用であるため、ここでは使用しません。

プロのヒント: を使用しないでくださいSELECT *。代わりに、必要な列を名前で選択します。

プロのヒント: PDO や mysqli_ を使用するように勧められているのには、もっともな理由があります。mysql_ インターフェイスは安全でないことで有名です。パブリック ネットワークに mysql_ に基づく Web アプリケーションを配置すると、悪者があなたpwn します。たとえば、プロトタイプや概念実証の Web サイトを構築している場合など、pwned を気にしない場合は、心配する必要はありません。

結果セットを 5 つのポスト チャンクにセグメント化する前に、結果セットの順序を取得しましょう。ORDER BY節には 2 つの項目が必要です。結果セットをこのように並べたいようです。

SELECT * 
  FROM notifications 
 WHERE user_id = ? 
 ORDER BY post_id, time_sent DESC

. なしで試してみて、LIMIT 5php コードをデバッグして、目的には長すぎる場合でも、適切な表示が得られるようにします。

次に、私の理解が正しければ、一度に 5 つの投稿を表示しようとしています。5 つの投稿が必要であり、それぞれにさまざまな数の通知を含めることができるため、これはより複雑になります。

そのため、一度に 5 つの投稿を取得する方法を考え出す必要があります。このサブクエリはそれを行い、5 つの post_id 値のリストを提供します。

 SELECT DISTINCT post_id
   FROM notifications
  WHERE user_id = ?
  ORDER BY post_id
  LIMIT 5 OFFSET ?   

OFFSET ?1 番目、2 番目、3 番目などの 5 つの投稿の束を取得するには、パラメータを 0、5、10などにする必要があります。最初の 5 つの投稿のみが必要な場合は、OFFSET句を省略してください。

ここで、すべてのデータを取得するために、5 つの投稿のみを取得するサブクエリを別のクエリに埋め込む必要があります。それはこのように機能します。

SELECT * 
  FROM notifications 
 WHERE post_id IN (
                      SELECT DISTINCT post_id
                        FROM notifications
                       WHERE user_id = ?
                       ORDER BY post_id
                       LIMIT 5 OFFSET ?   
                  ) 
 ORDER BY post_id, time_sent DESC

この最後の、より複雑な SQL クエリは、最初のステートメントのような結果セットを返します。デバッグされた php コードにプラグインして、探している表示を取得できるはずです。

于 2013-10-28T13:14:22.380 に答える