2013-08-01 2 views
-1

У меня есть PHP-скрипт, который извлекает сообщения из базы данных, а затем отображает их в стиле почтового ящика, по одной строке для каждого сообщения. Каждое сообщение является частью разговора между двумя пользователями. В настоящее время проблема заключается в том, что он возвращает 1 новое сообщение на выходе для каждого сообщения в разговоре.mySQL select - как получить только 1 результат и самый высокий идентификатор номера?

Если это имеет смысл? Вот код для запроса:

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

Если аргумент состоит в следующей строке запроса:

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 

Часть:

m.* FROM " . DB_PREFIX . "messaging m 

выбирает данные из MySql строк, содержащихся колонны, такие как

topic_id 

и

message_id 

То, что я пытаюсь сделать, это выше MYSQL запрос возвращает только вернуть ONE (1) результат за topic_id (как может быть несколько topic_id с тем же номером) и в сочетании с только что LATEST (наибольшее число) сообщения message_id.

Так в основном, если есть:

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

Я хочу только бы MySql вернуться 15/12 и 19/04. Как я могу сделать это с помощью вышеупомянутого запроса на выбор mySQL?

Большое спасибо :)

+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 variable» :( – 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);