2014-09-12 4 views
0

Если я запускаю следующую команду MySQL:Выберите только один из каждой «группы»

SELECT * FROM mail f where f.toUserId = 15 AND f.toUserDeleted=0 ORDER BY f.sentDate DESC limit 0,100000 

я получить все сообщения в правильном порядке, я могу ясно видеть последние сообщения на вершине, что было отправлено в прошлом.

Однако я должен destict этот поиск что-то вроде этого:

SELECT 
    f.id, 
    f.fromUserId, 
    f.fromUserNickName, 
    f.readDate, 
    f.sentDate, 
    f.subject, 
    f.fromUserDeleted, 
    f.toUserId, 
    f.toUserDeleted, 
    (SELECT count(*) FROM mail m1 WHERE m1.fromUserId=f.fromUserId AND m1.toUserId=f.toUserId) as messageCount 
FROM mail f 
WHERE 
    f.toUserId = 15 AND 
    f.toUserDeleted=0 
GROUP BY(f.fromUserId) 
ORDER BY 
    f.sentDate 
DESC 
    limit 0,100000 

Проблема заключается в том, что эта команда будет не хватать некоторых пользователей, что было показано в команде пред MySQL?

РЕДАКТИРОВАТЬ 1:

Я попытался это:

SELECT m1.* 
FROM mail m1 
LEFT JOIN mail m2 ON(m1.fromUserId = m2.fromUserId AND m1.sentDate < m1.sentDate) 
WHERE m2.id IS NULL 
ORDER BY m1.sentDate; 

Он принимает навсегда, не знаю, если это действительно возвращение ничего.

Edit 2:

Вторая попытка:

SELECT p1.id, p1.fromUserId, p1.fromUserNickName, p1.sentDate 
FROM 
    mail p1 
INNER JOIN 
    (SELECT pi.id, MAX(pi.sentDate) as latestDate FROM mail pi GROUP BY pi.fromUserId) p2 
    ON(p1.id = p2.id) 
WHERE 
    p1.toUserId = 15 
ORDER BY 
    p1.sentDate desc; 

Это не возвращает всех пользователей, которые были отправить почту пользователю 15.

Edit 3:

Barmar' Второе предложение выглядит следующим образом:

SELECT m1.*, (SELECT count(*) FROM mail m3 WHERE m3.fromUserId=m1.fromUserId AND m3.toUserId=m1.toUserId) as messageCount 
FROM mail m1 
LEFT JOIN mail m2 ON (m1.fromUserId = m2.fromUserId 
         AND m1.sentDate < m2.sentDate 
         AND m2.toUserId = 15) 
WHERE m2.id IS NULL 
AND m1.toUserId = 15 
ORDER BY m1.sentDate DESC; 
+0

Это должно получить одно сообщение для каждого пользователя, если у вас есть более чем 100000 пользователей. – Barmar

+0

Я подозреваю, что это ваш реальный вопрос: http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group – Barmar

+0

@Barmar Да, теперь я вижу, что вы правы. Проблема в том, что он не выбирает новейшее сообщение от каждого пользователя, и это создает странный порядок сортировки. Как это можно решить? – Banshee

ответ

0

В обоих случаях вы не фильтруете таблицу, к которой вы присоединяетесь, вплоть до сообщений, отправленных на ваш идентификатор.

Первый метод:

SELECT m1.* 
FROM mail m1 
LEFT JOIN mail m2 ON (m1.fromUserId = m2.fromUserId 
         AND m1.sentDate < m2.sentDate 
         AND m2.toUserId = 15) 
WHERE m2.id IS NULL 
AND m1.toUserId = 15 
ORDER BY m1.sentDate DESC; 

Второй метод:

SELECT p1.id, p1.fromUserId, p1.fromUserNickName, p1.sentDate 
FROM 
    mail p1 
INNER JOIN 
    (SELECT pi.id, MAX(pi.sentDate) as latestDate 
    FROM mail pi 
    WHERE pi.toUserId = 15 
    GROUP BY pi.fromUserId) p2 
    ON (p1.id = p2.id) 
WHERE 
    p1.toUserId = 15 
ORDER BY 
    p1.sentDate desc; 
+0

Спасибо, первый не работает, но второй работает просто отлично. – Banshee

Смежные вопросы