2013-11-06 5 views
0

Я пытаюсь заказать список знакомых текущего пользователя по количеству непрочитанных сообщений от друзей. Более непрочитанные сообщения, которые есть у друга по отношению к текущему пользователю, выше, он должен быть помещен в список.Mysql - orderby count of another statement

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

SELECT COUNT(*) AS unread_msg 
FROM messages m LEFT JOIN users u ON m.from_user_id = u.id 
    WHERE 1 /* Current user, unread msg to */ IN (from_user_id,to_user_id) 
     AND 2 /* Friend, unread msg from */ IN (from_user_id,to_user_id) 
     AND to_user_id = 1 /* Current user, unread msg to */ 
     AND seen = 0 

И с помощью SO-SQL гуру У меня есть запрос для списка друзей:

SELECT a.name_surname, 
     a.avatar, 
     GROUP_CONCAT(DISTINCT w.word ORDER BY w.word ASC) AS friend_words, 
     (a.friend_id) AS friend_msg_id /* Unread msg from id */ 
FROM (
    SELECT f1.asked_user_id AS friend_id, 
     f1.created, 
     u.name_surname, 
     u.avatar 
    FROM friends AS f1 
    INNER JOIN friends AS f2 ON f1.asked_user_id = f2.asker_user_id 
    INNER JOIN users AS u ON f1.asked_user_id = u.id 
     AND f1.asker_user_id = f2.asked_user_id 
    WHERE f1.status = 1 AND f2.status = 1 
     AND f1.asker_user_id = 1 /* Current user id */ 
) a 
LEFT JOIN connections c ON c.user_id = a.friend_id 
LEFT JOIN words_en w ON c.word_id = w.id 
GROUP BY 1 

Любые идеи, как объединить эти запросы? Итак, я получаю unread_msg внутри второго запроса?

и скрипка: http://www.sqlfiddle.com/#!2/129a6/1

ответ

1

ли это делать то, что вам нужно?

Я просто взял ваш второй запрос, вложил его и добавил левое соединение с таблицей сообщений и соответствующей группировкой.

Я считаю, что он может быть построен более эффективно (без дополнительной вложенности), но я немного обеспокоен тем, как он будет работать с GROUP_CONCAT, который у вас есть (плюс я не уверен, что делает таблица слов), и для проверки этого в ваших таблицах недостаточно данных.

select b.name_surname,b.avatar,b.friend_words,b.friend_msg_id, count(m.id) from (
    SELECT a.name_surname as name_surname, 
      a.avatar as avatar, 
      GROUP_CONCAT(DISTINCT w.word ORDER BY w.word ASC) AS friend_words, 
      (a.friend_id) AS friend_msg_id /* Unread msg from id */ 
    FROM (
     SELECT f1.asked_user_id AS friend_id, 
      f1.created, 
      u.name_surname, 
      u.avatar 
     FROM friends AS f1 
     INNER JOIN friends AS f2 ON f1.asked_user_id = f2.asker_user_id 
     INNER JOIN users AS u ON f1.asked_user_id = u.id 
      AND f1.asker_user_id = f2.asked_user_id 
     WHERE f1.status = 1 AND f2.status = 1 
      AND f1.asker_user_id = 1 /* Current user id */ 
    ) a 
    LEFT JOIN connections c ON c.user_id = a.friend_id 
    LEFT JOIN words_en w ON c.word_id = w.id 
) b 
left join messages m on m.to_user_id = 1 
      and m.from_user_id = b.friend_msg_id 
      and m.seen = 0 
group by b.name_surname,b.avatar,b.friend_words,b.friend_msg_id 
+0

Спасибо! Ну, это возвращает 0 новых сообщений. На самом деле мне пришлось добавить GROUP BY 1 раньше) b - иначе он возвращал только 1 друга. В моем тестовом db пользователь имеет двух друзей и друзей, которые не могут иметь никаких слов и должны отображаться в любом случае, поэтому группа 1 помогает в этом. –

+0

Я добавил полный db с большим количеством тестовых данных -> http://www.sqlfiddle.com/#!2/cfca5/2 –

+0

, когда я копировал ваше решение, это сработало ... прежде чем я просто скопировал вложенную часть контейнера ... Или вы меняете что-то в моем запросе? Кажется, я не вижу разницы: S –