Подсчет строк на основе нескольких столбцов - PullRequest
0 голосов
/ 25 марта 2019

У меня есть таблица из нескольких столбцов с таким же набором тегов, как этот:

id  |  tagone  |  tagtwo  |  tagthree  |
----------------------------------------
0   |  Action  | Adventure|   Rpg      |
1   |   Rpg    |  Action  |   Indie    |

Никогда не будет нескольких одинаковых тегов в строке. Что я хочу, это вернуть количество элементов для каждого тега. Я хочу, чтобы он не зависел от того, в каком столбце он находился, и рассчитывал каждый столбец. Вот так:

Action    |2     |
Adventure |1     |
Indie     |1     |
Rpg       |2     |

Есть ли способ сделать это в одном запросе?

Ответы [ 3 ]

4 голосов
/ 25 марта 2019

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

Тем временем вы можете отменить это:

select tag, count(*)
from ((select id, tagone as tag from t) union all
      (select id, tagtwo as tag from t) union all
      (select id, tagthree as tag from t) 
     ) tt
group by tag
1 голос
/ 25 марта 2019

Вот еще одно решение:

SELECT SUM(tagone='Action' + tagtwo='Action' + tagthree='Action) AS count
FROM MyTable

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

Если у вас есть многозначный атрибут, вам нужна другая таблица.Тогда вы можете посчитать более понятным образом:

CREATE TABLE MyTableTags (
  mytable_id INT NOT NULL,
  tag VARCHAR(20) NOT NULL,
  PRIMARY KEY (mytable_id, tag)
);

SELECT COUNT(*)
FROM MyTableTags
WHERE tag = 'Action'
0 голосов
/ 25 марта 2019

Вам нужно UNION ALL:

SELECT tags, COUNT(*)
FROM (SELECT t.id, t.tagone AS tags
      FROM table t
      UNION ALL
      SELECT t.id, t.tagtwo  
      FROM table t
      UNION ALL
      SELECT id, t.tagthree 
      FROM table t
    ) t
GROUP BY tags;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...