2017-01-21 6 views
0

Я кластеризую для статей новостей. Я классифицирую ряд данных на несколько кластеров. то, что я хочу сделать, - это взять одну информацию из каждого кластера с содержанием самого длинного текста.Как выбрать самый длинный текст из моей базы данных mysql?

У меня есть две таблицы, я хочу присоединиться к этим двум таблицам и показать только запись с самым длинным текстом.

мои таблицы:

Таблица newscontent

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

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 

Как я могу это сделать?

+0

Что вы подразумеваете под «самой длинной текстовой записью»? он основан на поле 'content' – Imran

+0

* Только ** запись ** ... *. Если вам нужна только одна запись, почему ваш желаемый результат имеет 2 записи? – Bohemian

+0

Ваше последнее обновление не изменяет данные или ожидаемый результат. –

ответ

0

Вы можете выполнить то, что хотите, используя серию объединений. Однако у меня такое ощущение, что ваша схема не полностью нормализована.

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' 
+0

Спасибо, этот код работает нормально. Но как, если я хочу выбрать только категорию «a»? –

+0

Затем просто добавьте 'WHERE t2.category = 'a'' в конец моего запроса. –

+0

Спасибо, это работает :) –

0

Попробуйте это:

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

Он хочет получать поля из 'newscontent', и ваш запрос полностью опускает эту таблицу. –

+0

@tim oops. Скопируйте вклеенное неправильное имя таблицы. Должен работать сейчас. – Bohemian

+0

У обновления также есть проблема, потому что вы выбираете неагрегатные столбцы с 'GROUP BY'. Это не будет работать в большинстве других баз данных и даже не во всех версиях MySQL. –

Смежные вопросы