2016-08-29 4 views
-1

Я таблица с именем как должностиMysql выбрать уникальное поле из сгруппированной таблицы

|id|user_id|title|description| 

любит таблицу как этот

|id|user_id|post_id| 

здесь мой SQL код

select count(likes.id) as like_count, posts.* from `posts` left join 
`likes` on `likes`.`post_id` = `posts`.`id` where `posts`.`status` = 'A' 
group by `posts`.`id` order by `like_count` desc LIMIT 6 

Вот

|like_count | id | user_id | title | description | 
--------------------------------------------------- 
    17  | 723 | 12 | ... | ....  | 
    15  | 721 | 15 | ... | ....  | 
    14  | 711 | 12 | ... | ....  | 
    13  | 700 | 12 | ... | ....  | 
    12  | 800 | 11 | ... | ....  | 
    12  | 920 | 12 | ... | ....  | 

как вы видите user_id 12 повторяет время, я хочу только одно сообщение от одного пользователя.

Есть ли способ выбрать наиболее понравившуюся должность каждого пользователя и сделать user_id не повторением.

+0

Я не downvote вас, но ваша схема требует дальнейшего объяснения. Таблица 'posts' связывает пользователей с сообщениями, а затем' любит' делает то же самое. Каково было ваше намерение при составлении таблиц? –

+0

@TimBiegeleisen user_id в сообщениях, вероятно, является пользователем, который его создал, а user_id on likes table - это пользователь, которому это понравилось. Я не думаю, что в этом есть что-то странное. –

+0

@DavidAllen Не стесняйтесь дать ответ, но будьте готовы к повторению нескольких раз (или больше). –

ответ

0

Я знаю, что это может быть не самое эффективное решение, но это первое, что пришло мне в голову. К сожалению, MySQL не поддерживает функции окна, поэтому задача намного сложнее и менее элегантна, чем подход, который можно использовать с помощью оконных функций.

Наиболее понравившиеся сообщения каждого пользователя, который будет повторяться user_id, если случится быть более чем один пост с равным числом подобных, и это число является наибольшим для конкретного пользователя:

select 
    user_likes.post_user_id, 
    user_likes.like_count, 
    p.id as post_id, 
    p.title, 
    p.description 
from (
    select 
    p.user_id   as post_user_id, 
    MAX(l.like_count) as like_count 
    from posts p 
    inner join (select post_id, count(*) as like_count from likes group by post_id) l on p.id = l.post_id 
    group by p.user_id 
) user_likes 
    inner join (select post_id, count(*) as like_count from likes group by post_id) l on user_likes.like_count = l.like_count 
    inner join posts p on l.post_id = p.id 

Если вы действительно нужна одна строка для каждого пользователя, тогда в случае связей в количестве одинаковых для разных сообщений вам нужно выбрать стратегию для извлечения только одного из них. Например, вы могли бы взять тот, который был старше, добавив группировку на post_id и взяв min() его значения и присоединившись к таблице сообщений, чтобы получить его название и описание.

В этом случае модификация скрипта может выглядеть следующим образом:

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