2013-08-01 26 views
-1

我有一個PHP腳本,它從數據庫中檢索消息,然後以收件箱樣式的方式顯示它們,每條消息一行。每條消息都是2個用戶之間對話的一部分。現在,問題是它會在對話中的每條消息的輸出中返回1條新消息。mySQL選擇 - 如何檢索只有1個結果和最高的數字ID?

如果有道理?下面是查詢代碼:

$sql_select_messages = $db->query(...); 

凡的說法是下面的查詢字符串:

m.* FROM " . DB_PREFIX . "messaging m 

選擇從包含MySQL的行中的數據:

SELECT m.admin_message, a.name, u.username AS sender_username, 
    m.* FROM " . DB_PREFIX . "messaging m 
LEFT JOIN " . DB_PREFIX . "items a ON a.items_id=m.items_id 
LEFT JOIN " . DB_PREFIX . "users u ON u.user_id=m.sender_id 
WHERE m.receiver_id='" . $session->value('user_id') . "' AND m.receiver_deleted=0" . 
    (($page == 'summary') ? " AND m.is_read=0" : '') . " 
ORDER BY " . $order_field . " " . $order_type . " LIMIT " . $start . ", " . $limit 

的一部分列如

topic_id 

message_id 

我試圖做的是有上述的MySQL查詢只返回返回一(1)每topic_id結果(因爲可能會有幾個topic_id用相同的號碼),並結合,只有最新(最高號碼)的message_id。

所以基本上如果有:

================ 
topic_id | message_id 
================ 
15   10 
15   11 
15   12 
19   02 
19   03 
19   04 

我只希望MySQL返回15/12和19/04。我將如何去做與上面的mySQL select查詢?

非常感謝你:)

+0

你有w.name和r.name,但我沒有在這裏看到w或r表格。想一想,在這裏發佈裸露的SQL查詢示例會更好。 –

+0

對不起,我刪除了那部分,忘了它上面。只是更新了它。現在應該是正確的:) – user2643870

+0

'topic_id'和'message_id'是否在同一個表中,或者它們是否在JOIN中涉及的單獨表中? – Sammitch

回答

0

需要兩列,並組合這些列來排序。

將以下腳本追加到您的SQL中。

GROUP BY topic_id 
ORDER BY topic_id DESC, message_id DESC 

希望這會有所幫助。

+0

試過,但得到'Undeclared變量'錯誤:( – user2643870

+0

爲記錄,我也嘗試m.topic_id和m.message_id與相同的未聲明的變量錯誤 – user2643870

+0

這聽起來不像是一個MySQL錯誤,是嗎?將腳本放在引號之間?未聲明的變量看起來像將它放到SQL腳本之外,編譯器將其作爲編譯器在您的代碼中找不到的變量,MySQL通常會彈出「未知列」之類的錯誤。 – Jonathan

0

您的查詢可能是這樣的

SELECT m.admin_message, a.name, u.username sender_username, m.* 
    FROM 
(
    SELECT MAX(message_id) message_id 
    FROM messaging 
    WHERE ... -- < all your where conditions go here 
    GROUP BY topic_id 
) q JOIN messaging m ON q.message_id = m.message_id LEFT JOIN items a 
    ON a.items_id = m.items_id LEFT JOIN users u 
    ON u.user_id = m.sender_id 
ORDER BY ... 
LIMIT ... 

這裏是SQLFiddle演示

現在在PHP端它看起來像

$sql = "SELECT m.admin_message, a.name, u.username sender_username, m.* 
    FROM 
(
    SELECT MAX(message_id) 
    FROM " . DB_PREFIX . "messaging 
    WHERE m.receiver_id = '" . $session->value('user_id') . "' AND m.receiver_deleted = 0 " . 
    (($page == 'summary') ? " AND m.is_read = 0" : '') . " 
    GROUP BY topic_id 
) q JOIN " . DB_PREFIX . "messaging m ON q.message_id = m.message_id LEFT JOIN " . DB_PREFIX . "items a 
    ON a.items_id = m.items_id LEFT JOIN " . DB_PREFIX . "users u 
    ON u.user_id = m.sender_id 
    ORDER BY " . $order_field . " " . $order_type . " LIMIT " . $start . ", " . $limit; 
$sql_select_messages = $db->query($sql);