我有一个由多列组成的表,这些表具有相同的标记集:
id | tagone | tagtwo | tagthree |
----------------------------------------
0 | Action | Adventure| Rpg |
1 | Rpg | Action | Indie |
同一行中永远不会有多个。我想要的是返回每个标签的元素计数。我希望它独立于所在的列并计算每列。像这样:
Action |2 |
Adventure |1 |
Indie |1 |
Rpg |2 |
在一个查询中有什么方法可以做到这一点吗?
答案 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;