2016-08-29 1 views
-1

I Tabelle als Beiträge genannt habeMysql wählen einzigartiges Feld aus einer groupped Tabelle

|id|user_id|title|description| 

Tabelle mag wie dies

|id|user_id|post_id| 

hier ist mein SQL-Code

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 

Hier ist die Ergebnis

|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 | ... | ....  | 

Wie Sie sehen, Benutzer-ID 12 wiederholt sich, möchte ich nur einen Beitrag von einem Benutzer.

Gibt es eine Möglichkeit, die am meisten gemachte Post jedes Benutzers auszuwählen und user_id nicht zu wiederholen.

+0

ich Sie nicht downvote, aber Ihr Schema erfordert weitere Erklärung. Die 'posts'-Tabelle bezieht Benutzer auf Posts, und' likes' macht dasselbe. Was war deine Absicht, als du die Tische entworfen hast? –

+0

@TimBiegeleisen die user_id auf Posts ist wahrscheinlich der Benutzer, der es erstellt hat, und die Benutzer_id auf Likes-Tabelle ist der Benutzer, der es mochte. Ich denke nicht, dass da etwas verrücktes ist. –

+0

@DavidAllen Fühlen Sie sich frei, eine Antwort zu geben, aber bereit sein, ein paar Mal (oder mehr) zu iterieren. –

Antwort

0

Ich bin mir bewusst, dass dies nicht die effizienteste Lösung ist, aber dies ist das erste, das mir in den Sinn kam. Leider unterstützt MySQL keine Fensterfunktionen, daher ist die Aufgabe viel schwieriger und weniger elegant als die Verwendung von Fensterfunktionen.

Meist beliebt Beiträge jeden Benutzer, die user_id wiederholen, wenn es mehr als ein Beitrag mit dem gleichen Anzahl von Leuten sein geschieht und diese Zahl ist die größte für bestimmte Benutzer:

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 

Wenn Sie wirklich benötigen Sie eine Zeile pro Benutzer, dann im Falle von Gleichständen in Anzahl der Likes für verschiedene Beiträge müssen Sie eine Strategie auswählen, um nur eine davon zu erhalten. Zum Beispiel könnten Sie die eine nehmen, die älter war, indem Sie Gruppierung auf post_id hinzufügen und den min() von seinem Wert nehmen und zurück zu posts Tabelle verbinden, um seinen Titel und Beschreibung abzurufen.

In diesem Fall Modifikation von oben Skript würde wie folgt aussehen:

Verwandte Themen