基于多列对行进行计数

时间:2019-03-25 14:25:41

标签: mysql sql

我有一个由多列组成的表,这些表具有相同的标记集:

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

同一行中永远不会有多个。我想要的是返回每个标签的元素计数。我希望它独立于所在的列并计算每列。像这样:

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

在一个查询中有什么方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:4)

这是错误的数据结构。您应该有一个表格,其中每个ID和每个标签都有一行。

与此同时,您可以取消此操作:

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 :(得分:1)

这是另一种解决方案:

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

但是我同意@GordonLinoff的观点,您不应将标签存储在多列中。这称为repeating groups, a conflict with First Normal Form

如果您具有多值属性,则需要另一个表。然后您可以以更清晰的方式进行计数:

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'

答案 2 :(得分:0)

您需要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;