【问题标题】:mysql: get distinct value of TEXTmysql:获取文本的不同值
【发布时间】:2015-05-01 19:04:42
【问题描述】:

我想获得唯一的消息(数据类型:TEXT)。我正在使用这个简单的查询来实现这一点:

SELECT DISTINCT message FROM `online_communication`

我得到的结果是:

hello.. what's up?
second message..
third message.....
third message.....

为什么我收到third message..... 2 次?我也试过:

SELECT DISTINCT BINARY message FROM `online_communication`

但是,在BLOB 中获得相同数量的行

PS:GROUP BY 也没有运气。

SQLFiddle: http://sqlfiddle.com/#!9/304e4/1

【问题讨论】:

  • 这很奇怪。您可以在 SQLFiddle 中重新创建表并获得相同的值吗?没有看到这个在行动是很难理解的。
  • SELECT message, hex(message) FROM online_communications -- 这将显示字符串的二进制表示,它们必须不同,只是看起来相同
  • @McAdam331:请检查 SQLFIDDLE。
  • 您是否尝试过应用 RTRIM / LTRIM 以确保没有空格?
  • @SamAbushanab:不,我没有。让我试试小提琴

标签: mysql sql


【解决方案1】:

这符合预期,因为您的价值观不同。从你的 SQL 小提琴:

INSERT INTO `online_communication` (`id`, `company_id`, `country_id`, `message`, `date_added`, `time_interval`) VALUES
(53, 1, 210, 'third message.....\r\nand here..\r\n', '2015-05-01 11:05:31', '1'),
(61, 1, 103, 'third message.....\r\nand here.. \r\n', '2015-05-01 11:06:38', '1');

请注意,第一个插入在两个句点之后没有空格,但第二个插入。它们在结果中看起来相同,因为差异仅代表空白。

编辑

根据定义,这些独特的消息,因此您的查询没问题。但是,如果您想将它们视为相同,则需要找到将它们定义为相同的业务规则。

例如,您可以删除字符串中的所有空格,然后以这种方式进行比较:

SELECT DISTINCT REPLACE(message, ' ', '') FROM `online_communication`

这是一个有效的Fiddle 示例。

这里有一些有用的string 函数。请注意,您不能在此处使用TRIM(),因为该函数仅删除字符串开头或结尾的空格。在本例中,它位于中间,因此REPLACE 更有用。

【讨论】:

  • 是的。那是用户插入的数据。但是,如何在获取数据时避免额外的空间?我应该怎么做才能收到独特的消息?
  • @RahulTripathi: Itried with: SELECT DISTINCT trim(message) FROM online_communication 仍然给我双重信息
  • @RahulTripathi TRIM 在这里不起作用,因为空格在字符串内部,而不是在字符串的两端。 REPLACE() 是你要找的字符串函数。
  • @RonakPatel:- 是的,改用REPLACE(message, ' ', '')
  • 但是,正如我所提到的,我无法向用户显示没有空格的消息。如果我使用它,那么它将解决所有问题。SELECT message FROM online_communication GROUP BY REPLACE(message, ' ', '') 它会给我带空格的结果并且独一无二。
【解决方案2】:

你的一行有一个额外的空间

(53, 1, 210, 'third message.....\r\nand here..\r\n', '2015-05-01 11:05:31', '1'),
(61, 1, 103, 'third message.....\r\nand here.. \r\n', '2015-05-01 11:06:38', '1');

删除它,您将获得预期的结果。

SQL FIDDLE DEMO

【讨论】:

  • 是的。那是用户插入的数据。但是,如何在获取数据时避免额外的空间?我应该怎么做才能收到独特的消息?
【解决方案3】:

“第三条消息.....”实例之一的末尾是否有空格?根据the documentation,尾随空格不会从 TEXT 类型中删除。您可以使用这样的查询进行检查:

SELECT DISTINCT concat('[', message,  ']') FROM `online_communication`

您将在结果中寻找类似的内容:

[hello.. what's up?]
[second message..]
[third message.....]
[third message.....   ]

【讨论】:

  • 我试过了。我找不到任何区别。你能检查一下sqlfiddle吗?
  • 你一下子得到了一堆答案 - 我看到其他人已经查看了数据并指出了具体的额外空间。
猜你喜欢
  • 2023-02-23
  • 2018-07-22
  • 1970-01-01
  • 2021-01-15
  • 2015-02-01
  • 1970-01-01
  • 2020-02-13
  • 2012-12-07
  • 1970-01-01
相关资源
最近更新 更多