我希望我制定正确的标题。
我正在尝试为帖子创建标签,例如在instagram中。
用户最多可以添加3个标签。我将它们分别保存在单独的数据库列中。 (tag1 / tag2 / tag3)及更高版本只想显示不同的值及其总数。无论它们位于哪一列。
例如,我有2个不同的mysql行(帖子)
第1行有:tag1 =房子,tag2 =厨房,tag3 =空
第2行有:tag1 =家,tag2 =花园,tag3 =房子
我想显示房屋(2) /厨房(1)/花园(1)/房屋(1)
我得到的结果是:房屋(1) /厨房(1)/花园(1)/房屋(1)/ 房屋(1),因为每个{{ 1}}在不同的列中。
我有数据库表(diy_posts):
我对sql查询的想法:
house
并像这样显示它们:
SELECT DISTINCT p.tag1 as tag1, p.tag2 as tag2, p.tag3 as tag3,
SUM(CASE WHEN p.tag1=tag1 OR p.tag2=tag2 OR p.tag3=tag3 THEN 1 ELSE 0 END) as count FROM diy_posts p GROUP BY p.id
答案 0 :(得分:3)
您可以通过取消旋转表格来实现:
select tag, count(*)
from ((select p.tag1 as tag from diy_posts p) union all
(select p.tag2 as tag from diy_posts p) union all
(select p.tag3 as tag from diy_posts p)
) pt
group by tag;
需要执行此操作表明您可能没有正确的数据模型。更典型的模型是:
create table postTags (
postTagid int auto_increment primary key,
postId int,
tag_number int,
tag varchar(255)
);
我确实注意到,这确实需要触发器才能将标签的数量限制为三个。只需定义唯一的约束或索引,数据库就可以防止重复标签。
答案 1 :(得分:0)
使用不同的关键字无法实现所需的输出。
那是我猜想在现有模式中实现输出的唯一方法。 -但是,这会在标记和帖子大小增加时破坏性能,因此您需要更改表架构,也可以使用子表。
答案 2 :(得分:-1)
将其变成一列并求和:
select tag, count(*) as counts
from
(
SELECT p.tag1 as tag FROM diy_posts
UNION ALL
SELECT p.tag2 as tag FROM diy_posts
UNION ALL
SELECT p.tag3 as tag FROM diy_posts
) tmp
GROUP BY tag;