Database GROUP_CONCAT和DISTINCT都很好,但我该如何消除这些我仍然拥有的副本呢?

Database GROUP_CONCAT和DISTINCT都很好,但我该如何消除这些我仍然拥有的副本呢?,database,mysql,duplicates,group-concat,Database,Mysql,Duplicates,Group Concat,我有一个mysql表,设置如下: id uid keywords -- --- --- 1 20 corporate 2 20 corporate,business,strategy 3 20 corporate,bowser 4 20 flowers 5 20 battleship,corporate,dungeon 我希望我的输出是: 20 corporate,business,strategy,bowser,

我有一个mysql表,设置如下:

id uid keywords -- --- --- 1 20 corporate 2 20 corporate,business,strategy 3 20 corporate,bowser 4 20 flowers 5 20 battleship,corporate,dungeon 我希望我的输出是:

20 corporate,business,strategy,bowser,flowers,battleship,dungeon 但我得到的最接近的结果是:

SELECT DISTINCT uid, GROUP_CONCAT(DISTINCT keywords ORDER BY keywords DESC) AS keywords FROM mytable WHERE uid !=0 GROUP BY uid 哪些产出:

20 corporate,corporate,business,strategy,corporate,bowser,flowers,battleship,corporate,dungeon
有人有解决办法吗?提前谢谢你

不确定MySql是否有此功能,但SQL Server在分区上有一个排名,您可以使用它为每个结果分配一个排名……这样做将允许您只选择排名1的结果,而放弃其余的结果。

使用纯SQL无法完成数据结构化的操作

任何SQL实现都不会将公司和公司业务视为相等的字符串。因此,distinct不起作用

如果你能控制数据库

我要做的第一件事是将数据设置更改为:

id   uid   keyword     <- note, not keyword**s** - **ONE** value in this column, not a comma delimited list
1    20    corporate
2    20    corporate
2    20    business
2    20    strategy
有一个单独的关键字表

KeywordID    KeywordText
1            Corporate
2            Business

否则,您需要在代码中对数据进行处理。

嗯,您的关键字需要在自己的表中,每个关键字一条记录。然后你就可以这样做了,因为关键字将被正确分组。

在我看来,你有两个选择

备选案文1:

更改在自己的表中存储数据关键字的方式,使用多对多关系将现有表与关键字表连接起来。这将允许您使用DISTINCT。DISTINCT当前不起作用,因为查询将corporate和corporate、business、strategy视为两个不同的值

备选案文2:


编写一些“有趣的”sql来拆分关键字字符串。我不知道MySQL的限制是什么,但SQL一般不是为这个而设计的。

+1。这和我想说的差不多,用一种更简洁的方式。我也不确定,但听起来像是孤儿花,对吗?因为不能保证最大的一行包含所有可能出现在其他行中的关键字。如果可以的话,我希望每个结果都排成一行——这是我喜欢group_concat的一点。谢谢大家,我忘了提到避免大量额外的代码,包括搜索内容,我希望尽可能保持结构不变。
KeywordID    KeywordText
1            Corporate
2            Business