SQL从多个列中选择DISTINCT值

时间:2018-10-13 13:17:19

标签: mysql sql distinct

我希望我制定正确的标题。

我正在尝试为帖子创建标签,例如在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):

Image

我对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

3 个答案:

答案 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)

使用不同的关键字无法实现所需的输出。

  • 对于所需的输出,您的Table模式也是错误的。它必须是垂直的,而不是水平的。
  • 仍然在现有的Table结构中,可以通过在ServerSide中进行比较和计数过程来获得所需的输出(在您的情况下,似乎是PHP)。

那是我猜想在现有模式中实现输出的唯一方法。 -但是,这会在标记和帖子大小增加时破坏性能,因此您需要更改表架构,也可以使用子表。

答案 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;