Подписчики пользователя и идентификаторы последних 2 комментариев понравились каждому подписчику (если есть), а также количество подписчиков подписчика, использующих mysql - PullRequest
0 голосов
/ 01 апреля 2012

У меня есть социальное приложение, скажем, как твиттер, где пользователь может подписываться на других пользователей и может любить некоторые комментарии.

Мне нужно выбрать подписчиков пользователя и идентификаторы последних 2 комментариев, понравившихся каждому подписчику.(если есть), а также количество подписчиков подписчика, использующих MySQL.

Вот таблицы

Таблица user_follower

User_id  follower_id
1          2
2          3
1          5
1          6
1          7

Таблица user_likes

comment_id User_id date
41          2      some_date
42          2      some_date
41          5      some_date
42          5      some_date
43          5      some_date
43          2      some_date
43          6      some_date

как мы можем сделать это в одном запросе mysql?

пока я могу получить подписчиков и количество подписчиков подписчиков и подписаться на обоих.

select uf.follower_id, 
(select count(*) from  user_followers uf1 where uf1.follower_id = uf.follower_id) as following_count,
(select count(*) from  user_followers uf2 where uf2.user_id = uf.follower_id) as follower_count,
from user_followers uf 
join users u on u.id = uf.follower_id
where uf.user_id = 1

Теперь я хочу получить 2 последних комментария_идида для каждого подписчика, то есть uf.follower_id здесь.если невозможно в том же запросе, я в порядке даже с другим запросом, так как будет передавать follower_ids как в параметре, но он должен дать мне 2 последних комментария для каждого переданного идентификатора.

1 Ответ

0 голосов
/ 01 апреля 2012

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

SELECT follower_id, num_followers, GROUP_CONCAT(comment_id)
FROM (
    SELECT t.*,
        @r := IF(@g = t.follower_id, @r+1, 1) RowNum,
        @g := t.follower_id
    FROM (select @g:=null) AS initvars
    INNER JOIN (
        SELECT followers.*, ul.comment_id
        FROM (
            SELECT
                uf1.user_id,
                uf1.follower_id,
                COUNT(uf2.follower_id) AS num_followers
            FROM user_follower uf1
            LEFT JOIN user_follower uf2
                ON uf1.follower_id = uf2.user_id
            WHERE uf1.user_id = 1
            GROUP BY uf1.user_id, uf1.follower_id
        ) AS followers
        LEFT JOIN user_likes ul
            ON followers.follower_id = ul.user_id
        ORDER BY followers.follower_id ASC, comment_id DESC
    ) AS t
) AS final
WHERE RowNum < 3
GROUP BY follower_id, num_followers;

UPDATE Вот другой запрос, использующий соединение неравенства -

SELECT tmp.follower_id, COUNT(uf2.follower_id) AS num_followers, tmp.comments
FROM (
    SELECT follower_id, GROUP_CONCAT(comment_id ORDER BY comment_id DESC) AS comments
    FROM (
        SELECT uf.follower_id, ul1.*
        FROM user_follower uf
        LEFT JOIN user_likes ul1
            ON uf.follower_id = ul1.user_id
        LEFT JOIN user_likes ul2
            ON uf.follower_id = ul2.user_id
            AND ul1.comment_id < ul2.comment_id
        WHERE uf.user_id = 1
        GROUP BY ul1.user_id, ul1.comment_id
        HAVING COUNT(ul2.comment_id) < 2
    ) AS tmp
    GROUP BY tmp.follower_id
) AS tmp
LEFT JOIN user_follower uf2
    ON tmp.follower_id = uf2.user_id
GROUP BY tmp.follower_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...