Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从mysql数据库中选择最长的文本?_Mysql_Sql_Group By_Sql Order By - Fatal编程技术网

如何从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等,但最好不要依赖这些怪癖。