Создание списка лидеров (ранжированного списка участников) в MySQL с вложенными запросами - PullRequest
1 голос
/ 24 марта 2012

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

Первый запрос захватывает список участников:

SELECT member_id, username, screen_name FROM exp_members WHERE group_id IN (1,5) LIMIT 100

Второйзапрос вложен в первый запрос, и он подсчитывает, сколько раз были добавлены записи участника:

SELECT COUNT(*) AS favorite_count
   FROM qb_channel_titles, qb_channel_data, qb_matrix_data
   WHERE qb_channel_titles.channel_id = '1'
   AND qb_channel_titles.entry_id = qb_channel_data.entry_id
   AND qb_channel_titles.entry_id = qb_matrix_data.entry_id
   AND field_id = '13'
   AND author_id = 'MEMBER_ID_FROM_FIRST_QUERY'
   ORDER BY favorite_count DESC"
}

Итак, мой код выглядит так:

[first query]
   [second query]
      ..output one row of the leaderboard..
   [/second query]
[/first query]

Вложенностьвторой запрос внутри первого дает мне правильный список участников и количество голосов, которые они получили каждый, но список отсортирован по первому (внешнему) запросу, а не по второму (внутреннему) запросу.

Два вопроса:

  1. Как отсортировать список членов по favorite_count в порядке убывания?
  2. Какой наиболее эффективный способ сделать это?Я подозреваю, что вложенные запросы - не лучший способ, но я, честно говоря, не знаю ничего лучше.

1 Ответ

1 голос
/ 24 марта 2012

Вы пытаетесь сделать что-то подобное?

SELECT
    member_id,
    username,
    screen_name,
    (SELECT COUNT(*) AS favorite_count
       FROM qb_channel_titles, qb_channel_data, qb_matrix_data
       WHERE qb_channel_titles.channel_id = '1'
       AND qb_channel_titles.entry_id = qb_channel_data.entry_id
       AND qb_channel_titles.entry_id = qb_matrix_data.entry_id
       AND field_id = '13'
       AND author_id = member_id
       ORDER BY favorite_count DESC") as "Votes"
FROM
    exp_members
WHERE
    group_id IN (1,5)
ORDER BY
    (SELECT COUNT(*) AS favorite_count
       FROM qb_channel_titles, qb_channel_data, qb_matrix_data
       WHERE qb_channel_titles.channel_id = '1'
       AND qb_channel_titles.entry_id = qb_channel_data.entry_id
       AND qb_channel_titles.entry_id = qb_matrix_data.entry_id
       AND field_id = '13'
       AND author_id = member_id
       ORDER BY favorite_count DESC")
LIMIT 100

Вы также можете поместить этот запрос в представление и запросить представление (что-то вроде вложенности другого запроса с точки зрения производительности). Я не эксперт по производительности, но я бы сказал, что вы могли бы использовать триггер и сохранить в поле «fav__Count» другую таблицу, и каждый раз, когда пользователь что-то добавляет в избранное, триггер будет обновляться. Другая таблица может иметь только ID|COUNT. Это увеличит время при добавлении в избранное, но уменьшит время проверки списка лидеров, поэтому эффективность будет зависеть от вашего профиля пользователя для добавления в избранное или просмотра списков лидеров ...

...