Mysql получить 5 лучших результатов на группу при внутреннем объединении - PullRequest
2 голосов
/ 03 апреля 2012

В прошлом я создавал сайты со сложными запросами (для меня в любом случае), но я решил, что из-за того, как я программирую, я должен подготовить запросы к БД, которые мне нужны, прежде чем создавать свой сайт.Таким образом, я могу избежать реструктуризации и т. Д., Но у меня нет реальных данных для игры.Итак, на моем сайте будет размещен пользователь.Этот пост может быть повторно опубликован любым другим пользователем.Мне нужно получить топ-5 сообщений от каждого тега в зависимости от того, сколько раз он был повторно опубликован.Таким образом, если тег «бейсбол» был, и 3000 пользователей имели сообщение с этим тегом, мне нужно получить 5 лучших, которые были переизданы.Структура:

POSTS
-post_id
-member_id
-tag
-title
-post
-date_posted
-is_active

TRICKLES
-post_id
-member_id
-date_trickled

У меня есть этот запрос, я думаю, что он идет вразрез ...

select p.post_id, p.tag, p.title, count(p.post_id) from (
select * from posts p inner join
trickles t on t.post_id=p.post_id
group by p.tag order by count(p.post_id) desc limit 5
) order by p.tag asc

Для меня это говорит.Сначала (внутренний запрос) получите все посты и связанный с ними ручеек (перепубликуйте) и сгруппируйте их по тегу, затем упорядочите по верхнему количеству постов и ограничьте его до 5. Затем получите идентификатор, тег, заголовок, количество (общее количество раз, когда этот пост был зачеркнут), и упорядочить его в алфавитном порядке по тегу

. Я думаю, что это даст мне 5 лучших треклов на группу в базе данных, но мне сложно это понять, без фактическогоданные, и я не буду, пока люди не присоединятся и не начнут отправлять сообщения.Каждый раз, когда я глубоко задумываюсь об этом, я чувствую, что мой разум перепутан.Исходя из того, что я сказал, получит ли этот запрос 5 повторных публикаций по каждому общему «тегу» в БД?Я ценю это заранее!

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Полагаю, этот трюк с перечислением строк поможет вам.Это немного сложно, но должно работать правильно:

select 
    j.tag,
    j.post_id,
    j.title,
    j.cnt
from (
            select
                case when @b <> i.tag then (select @a := 0) end tmp1,
                case when @b <> i.tag then (select @b := i.tag) end tmp2,
                (select @a := @a + 1) num,
                i.*
            from (
                        select
                            p.title,
                            p.post_id, 
                            p.tag, 
                            count(*) cnt
                        from posts p
                        left join tickles t on t.post_id = p.post_id
                        group by 
                            p.post_id, p.tag, p.title
                        order by p.tag, count(*) desc
            ) i
            left join (select @a := 0, @b := '') x on 1=1 
) j
where j.num <= 5
1 голос
/ 03 апреля 2012

Я бы порекомендовал вам взглянуть на эту ссылку . Проверьте Однопроходную технику out.

...