如何从mysql数据库中选择最长的文本?
我为新闻文章做聚类。我将大量数据分类为多个集群。我想做的是从每个集群中获取一个数据,其中包含最长文本的内容 我有两个表,我想连接这两个表,只显示文本最长的记录 我的桌子: 表新闻内容如何从mysql数据库中选择最长的文本?,mysql,sql,group-by,sql-order-by,Mysql,Sql,Group By,Sql Order By,我为新闻文章做聚类。我将大量数据分类为多个集群。我想做的是从每个集群中获取一个数据,其中包含最长文本的内容 我有两个表,我想连接这两个表,只显示文本最长的记录 我的桌子: 表新闻内容 news_id title content category 1 abcd abcd a 2 abcd abcdefg a 3 abcd abcdefghij a 4
news_id title content category
1 abcd abcd a
2 abcd abcdefg a
3 abcd abcdefghij a
4 efgh efgh a
5 efgh efghijk a
6 efgh efghijklmn a
7 ijkl ijkl b
8 ijkl ijklmn b
表新闻群集
newscluster_id news_id category cluster
1 1 a 0
2 2 a 0
3 3 a 0
4 4 a 1
5 5 a 1
6 6 a 1
期望输出:
news_id title content category cluster
3 abcd abcdefghij a 0
6 efgh efghijklmn a 1
我该怎么做 通过使用一系列连接,您可以实现您想要的功能。但是,我觉得您的模式没有完全规范化
SELECT t2.news_id,
t2.title,
t2.content,
t2.category,
t1.cluster
FROM newscluster t1
INNER JOIN newscontent t2
ON t1.news_id = t2.news_id
INNER JOIN
(
SELECT t1.cluster, MAX(CHAR_LENGTH(t2.content)) AS max_content_length
FROM newscluster t1
INNER JOIN newscontent t2
ON t1.news_id = t2.news_id
GROUP BY t1.cluster
) t3
ON t1.cluster = t3.cluster AND
CHAR_LENGTH(t2.content) = t3.max_content_length
-- WHERE t2.category = 'a'
试试这个:
select * from (
select a.*, cluster from newscontent a
join newscluster b on a.news_id =b.news_id
order by length(content) desc) x
group by cluster
有些人会抱怨,但如果它起作用,它就起作用了 “最长的文字记录”是什么意思?是否基于
内容
字段仅记录。。。。如果您只需要一条记录,为什么所需的输出有两条记录?您最近的更新不会更改数据或预期的输出。每个群集有一个输出(最长的文本),因此有两个输出,一个用于群集0,另一个用于群集1,对吗?谢谢,此代码工作正常。但是,如果我只想选择“a”类,那该怎么办呢?然后只需在我的查询末尾添加WHERE t2.category='a'
。对不起,我想可能有点问题。当我运行这段代码时,显示的数据只有171个,而有416个集群,每个集群应该显示一个最长的文本数据,因此应该显示416个数据。是真是假?更新你的问题,清楚地告诉我们你真正想要的是什么。他想要来自newcontent
的字段,而你的查询完全忽略了这个表。@tim oops。复制粘贴错误的表名。现在应该可以工作了。更新也有问题,因为您正在使用分组依据选择非聚合列。这不会在大多数其他数据库上运行,甚至不会在MySQL的所有版本上运行。@tim它不会在任何其他dbs AFAIK上运行,但这是MySQL的问题。If将在所有版本上运行,但5.7.5版及以后的版本在默认情况下只有FULL\u GROUP\u
true,因此必须对DB进行专门配置,以使其工作,但它仍然可以工作。嗯……它可能在MySQL的某些分支上运行,例如MariaDB、SQLite等,但最好不要依赖这些怪癖。