2013-10-28 128 views
1

我有一個通知系統(PHP,MySQL-爲主),我試圖做到以下幾點:沒有任何限制的職位分組但隨後被time_sent下令 查詢通知結果限制爲5(每次迭代) 。 然後我使用ajax來顯示5個通知的下一個迭代集。分組和排序問題

基本上我需要5通知在(每套),但他們每個人的時間,如果一組涉及一個崗位:有可能是因爲想盡可能多的通知:

這是怎麼會有顯示:

  1. 通知有關崗位的F - 發送1天前
  2. 首先通知有關後ç - 派出3天前
    • 二通知有關崗位ç - 發送1天前
    • 第三次通知有關後Ç - 送5天前
    • 第四次通知有關後Ç - 派出5天前
  3. 通知有關崗位Ÿ - 送出4天前
  4. 第一有關通知後d - 送5天前
    • 二通知有關崗位d - 派出5天前
    • 第三次通知有關崗位d送5天前就交Ÿ
  5. 通知 - 派出5天前

如果有新通知中關於後Y發出,這會很自然地調升到列表的頂部。

這是我已經開始之前,我決定實施這一組系統:

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

現在我迷路了,並用此組和秩序的邏輯鬥爭。

該數據庫包含課程的post_id列。

編輯:

我結束了變化相當顯着,我想SOR通知的方式。這是我最終做到的。它可能不是最有效的,但它工作的方式我想:

<?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爲後者加載更多代碼。

+0

來吧。多花點研究力量,你可以做得比這更好。 – Strawberry

+0

如果你剛剛開始,現在將是一個非常好的時間去研究PDO,或者至少,mysqli_來代替這個被廢棄的方法。 – Strawberry

+0

PDO或mysqli會迫使我改變我的整個網站。也許是下一個。 – Lois

回答

1

你不想在這裏使用GROUP BY,因爲這對彙總查詢。

臨提示:不要使用SELECT *。相反,請按名稱選擇您想要的列。

專業提示:人們建議您使用PDO或mysqli_,這是一個很好的理由。 mysql_接口是非常不安全的。如果你在公網上放了一個基於mysql_的web應用,一些壞道戳到你身上。如果您不介意正在使用,例如,如果您正在構建原型或概念驗證網站,請不要擔心。

讓我們在開始將它分割成五個後處理塊之前得到結果集排序。您在ORDER BY條款中需要兩個項目。看起來你希望你的結果集像這樣排序。

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

給一個嘗試,沒有LIMIT 5和調試你的PHP代碼,所以你得到一個不錯的顯示效果,即使是太長了你的目的。

接下來,如果我正確理解了你的話,你正試圖一次顯示五個帖子。這變得更加棘手,因爲你需要5個帖子,每個帖子可以有不同數量的通知。

所以我們必須想辦法一次獲得5個帖子。這個子查詢將做到這一點,給出了五個post_id值的列表。

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

OFFSET ?該參數應該是0,5,10,等等,以獲得第一,第二,第三等,一堆五個職位。如果您只想要前五個帖子,則省略OFFSET條款。

現在我們必須嵌入那個在另一個查詢中只獲得五個帖子來獲取所有數據的子查詢。這是這樣的。

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代碼中並獲取您要查找的顯示。

+0

Ollie,非常感謝那個答案。我實際上最終改變了我對它的分類方式,完全不同。我編輯了我的原始問題的信息。再次感謝! – Lois