MySQL COUNT () несколько столбцов - PullRequest
4 голосов
/ 13 апреля 2010

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

SELECT tag_1, flv, COUNT(tag_1) AS tagcount 
  FROM videos 
 WHERE NOT tag_1='' 
 GROUP BY tag_1 
 ORDER BY tagcount DESC LIMIT 0, 10

Однако в моей базе данных каждому видео разрешено три тега - tag_1, tag_2 и tag_3. Есть ли способ получить наиболее популярные теги для чтения из нескольких столбцов?

Структура записи:

+-----------------+--------------+------+-----+---------+----------------+ 
| Field           | Type         | Null | Key | Default | Extra          | 
+-----------------+--------------+------+-----+---------+----------------+ 
| id              | int(11)      | NO   | PRI | NULL    | auto_increment | 
| flv             | varchar(150) | YES  |     | NULL    |                | 
| tag_1           | varchar(75)  | YES  |     | NULL    |                | 
| tag_2           | varchar(75)  | YES  |     | NULL    |                | 
| tag_3           | varchar(75)  | YES  |     | NULL    |                | 
+-----------------+--------------+------+-----+---------+----------------+ 

Ответы [ 3 ]

6 голосов
/ 13 апреля 2010
select tag, flv, count(*) as tag_count
from (
  select tag_1 as tag, flv from videos
  UNION
  select tag_2 as tag, flv from videos
  UNION
  select tag_3 as tag, flv from videos
) AS X

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

ОБНОВЛЕНИЕ : добавлено AS X.

4 голосов
/ 13 апреля 2010

Вам необходимо отключить данные:

SELECT tag, COUNT(*)
FROM (
    SELECT tag_1 AS tag
    UNION ALL
    SELECT tag_2 AS tag
    UNION ALL
    SELECT tag_3 AS tag
) AS X (tag)
GROUP BY tag
ORDER BY COUNT(*) DESC

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

3 голосов
/ 13 апреля 2010

Это не совсем ответ на ваш вопрос, но я считаю, что это лучшее решение вашей проблемы.

Возможно ли изменить вашу схему? Если так, то я думаю, что было бы лучше, если бы вы нормализовали это, вытянув теги в отдельную таблицу. В таком случае вы можете получить 2 или 3 таблицы, в зависимости от того, могут ли теги быть произвольными строками или из набора / списка. При такой настройке у вас будет

Videos (VideoId, Flv)
Tags (TagId, TagName)
VideoTags(TagId, VideoId)

Тогда довольно легко найти самые популярные теги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...