2

我有一个像这样设置的mysql表:

id uid 关键字
-- --- ---
1 20 家企业
2 20 企业、业务、战略
3 20 企业,鲍泽
4 20朵花
5 20 战列舰,企业,地牢

我希望我的输出看起来像:

20 企业、商业、战略、鲍泽、鲜花、战舰、地牢

但我得到的最接近的是:

SELECT DISTINCT uid, GROUP_CONCAT(DISTINCT 关键字 ORDER BY 关键字 DESC) AS 关键字
 来自我的表
 哪里 uid !=0
 按 uid 分组

输出:

20 企业、企业、商业、战略、企业、鲍泽、鲜花、战舰、企业、地牢

有没有人有办法解决吗?提前致谢!

4

4 回答 4

5

使用纯 SQL 无法像您构建数据的方式那样做您正在做的事情。

没有 SQL 实现会查看“Corporate”和“Corporate, Business”并将它们视为相等的字符串。因此, 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

更好的是

id   uid   keywordId    
1    20    1
2    20    1
2    20    2
2    20    3

有一个单独的关键字表格

KeywordID    KeywordText
1            Corporate
2            Business

否则,您将需要在代码中处理数据。

于 2009-10-15T04:50:48.047 回答
1

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

于 2009-10-15T04:51:05.253 回答
0

不确定 MySql 是否有这个,但 SQL Server 有一个 RANK() OVER PARTITION BY,您可以使用它来为每个结果分配一个排名......这样做将允许您只选择排名 1 的那些,并丢弃其余的。

于 2009-10-15T04:47:21.733 回答
0

在我看来,你有两个选择。

选项1:

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

选项 2:

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

于 2009-10-15T04:56:09.027 回答