Отличительное значение mysql для подсчета

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

1) Я хочу убедиться, что отображается только один результат для каждой категории (у меня 5 категорий), я пытался использовать DISTINCT, но явно неправильно понял это.

2) Я хочу иметь возможность возвращать значение Howmany вне SQL-запроса:

"SELECT DISTINCT category_id, video_id, date_added, COUNT(video_id) AS howmany
FROM votes 
WHERE date_added BETWEEN SYSDATE() - INTERVAL 7 DAY AND SYSDATE()
GROUP BY video_id 
ORDER BY howmany DESC, video_id
LIMIT 5";

моя таблица голосов выглядит так:

id | video_id | category_id | date_added

РЕДАКТИРОВАТЬ: Ожидаемый результат -

video_id 2 category_id 4 количество голосов 500

video_id 5 category_id 1 количество голосов 377

video_id 88 category_id 3 количество голосов 25

video_id 45 category_id 5 количество голосов 23

video_id 9 category_id 2 количество голосов 2

Отображается видео с наибольшим количеством голосов в каждой категории за последние 7 дней.


person kalpaitch    schedule 16.08.2010    source источник
comment
DISTINCT удаляет только дубликаты из видимости — дубликаты означают, что дублируется вся строка значений. Если только одно значение столбца отличается, оно не считается дубликатом.   -  person OMG Ponies    schedule 16.08.2010


Ответы (4)


Скорее всего, вы захотите вместо этого GROUP BY category_id или даже GROUP BY category_id, video_id, если хотите еще больше разбить результаты.

person Marc B    schedule 16.08.2010
comment
Я согласен, но разве это не влияет на стоимость сколько, не будет ли она учитываться на основе всех видео в этой категории? - person kalpaitch; 16.08.2010
comment
Если группировать только по category_id, то да. Вы получите общее количество голосов за видео для каждой категории. Если вы сгруппируете по обоим полям, вы получите каждый отдельный video_id в каждой отдельной категории. - person Marc B; 16.08.2010

Если вам нужен только 1 результат в каждой категории, вы должны сгруппировать по категориям. Но поскольку в каждой категории может быть несколько идентификаторов video_id, в конечном итоге вы получите случайный идентификатор внутри категории, если не используете GROUP_CONCAT.

Если вы просто хотите получить различное количество значений столбца, поместите ключевое слово DISTINCT в функцию подсчета:

COUNT( DISTINCT video_id )
person Brent Baisley    schedule 16.08.2010

SELECT DISTINCT category_id, video_id, date_added, COUNT(video_id) AS howmany

функционально эквивалентен

GROUP BY category_id, video_id, date_added, COUNT(video_id)

Вы сказали: «Я хочу убедиться, что отображается только один результат в каждой категории», поэтому вы, вероятно, хотите что-то вроде этого:

SELECT category_id, video_id, date_added, COUNT(video_id) AS howmany
FROM votes 
WHERE date_added BETWEEN SYSDATE() - INTERVAL 7 DAY AND SYSDATE()
GROUP BY category_id 
ORDER BY howmany DESC, video_id
LIMIT 5;
person mluebke    schedule 16.08.2010

MySQL не имеет аналитической функциональности, которую вы использовали бы для подобных ситуаций — используйте:

SELECT x.video_id,
       x.category_id,
       x.howmany
  FROM (SELECT t.video_id,
               t.category_id,
               COUNT(*) AS howmany,
               CASE 
                 WHEN @category = t.category_id THEN @rownum 
                 ELSE @rownum := @rownum + 1 
               END AS rank,
               @category := t.category_id
          FROM VOTES t
          JOIN (SELECT @rownum := 0, @category := -1) r
         WHERE t.date_added BETWEEN SYSDATE() - INTERVAL 7 DAY AND SYSDATE()
      GROUP BY t.video_id, t.category_id
     ORDER BY t.category_id, howmany DESC) x
 WHERE x.rank = 1
ORDER BY x.howmany DESC
   LIMIT 5
person OMG Ponies    schedule 16.08.2010
comment
Вау, и у меня тоже нет аналитической функциональности, чтобы справляться с такими ситуациями. Очень красиво, но, боюсь, не совсем работает. И никаких ошибок не выдает. Спасибо хоть - person kalpaitch; 16.08.2010
comment
@kalpaitch: ошибок нет, но он не возвращает ожидаемые данные? - person OMG Ponies; 16.08.2010
comment
Страница перестанет загружаться, вот и все. По-видимому, не возвращает никаких данных. - person kalpaitch; 16.08.2010
comment
@kalpaitch: Страница, как в PHP? Как насчет запуска запроса из командной строки, phpmyadmin, администратора MySQL и т. д.? - person OMG Ponies; 16.08.2010
comment
моя ошибка - ГОЛОСОВАНИЕ утверждало, что это недействительная таблица, поэтому я обезглавил ее, хотя теперь она показывает только один результат. - person kalpaitch; 16.08.2010
comment
@kalpaitch: Запустите основной запрос — тот, что в скобках, начиная с FROM и заканчивая x. Я думаю, что у вас нет данных, которые, как вы думаете, у вас есть, основываясь на фильтрации даты... - person OMG Ponies; 16.08.2010