2017-02-16 10 views
0

Ich habe zwei Tabellen, eine ist "Posts" und andere sind "Kommentare", die Fremdschlüssel von Posts haben.PHP MySQL Fremdschlüssel Sortierung

Beitrag Tabelle

+----+-------+--------------+ 
| Id | Name | Message  | 
+====+=======+==============+ 
| 1 | John | John's msg | 
| 2 | Marco | Marco's msg | 
| 3 | Ivan | Ivan's msg | 
+----+-------+--------------+ 

Kommentar Tabelle Wie Beiträge von den meisten Kommentare angezeigt werden, ist postID Fremdschlüssel

+----+-------+--------------+--------+ 
| Id | Name | Comment  | PostId | 
+====+=======+==============+========+ 
| 1 | John | John's msg | 2  | 
| 2 |Joseph |Joseph's msg | 2  | 
| 3 | Ivan | Ivan's msg | 2  | 
| 4 |Natalie|Natalie's msg | 1  | 
+----+-------+--------------+--------+ 

Auf Frontend Seite Beiträge von id 2 sortiert werden würde, wie es die meisten Anmerkungen , dann 1 und post ID 2 als letzte.

Lösung thx to GurV:

select p.*, 
    (
     select count(*) cnt 
     from comments c 
     where c.postid = p.id 
     ) cnt 
from posts p 
order by cnt desc; 
+4

Komm Beitritt. Versuche etwas. – Strawberry

+1

Hast du tatsächlich irgendwas probiert oder kommst du einfach für eine schnelle Antwort hierher? – Option

Antwort

2

Sie können in einer Unterabfrage Anzahl der Kommentare für jede Stelle finden und kommen sie mit den Beiträgen Tabelle auf der gefundene Zählung auszuführen Sortierung:

select p.* 
from posts p 
left join (
    select postid, count(*) cnt from 
    comments 
    group by postid 
) c on p.id = c.postid 
order by c.cnt desc; 

Wenn Sie alle Posts holen, die es gibt, dann wird das oben genannte so schnell sein, wie es kommen kann.

Wenn es für ein paar Posts sein wird, können Sie eine korrelierte Abfrage verwenden, um Zählungen zu finden und danach zu sortieren.

select p.*, 
    (
     select count(*) cnt 
     from comments c 
     where c.postid = p.id 
     ) cnt 
from posts p 
order by cnt desc; 
+0

Was passiert, wenn Tabellen sehr groß werden? Dies könnte die Leistung verlangsamen – Energizem

+1

@Energizem - Aktualisiert mit einer mehr Details und einer alternativen Lösung – GurV

+0

1. Lösung zeigt nur Beiträge mit 1 oder mehr Kommentare, Beiträge mit 0 Kommentare sind nicht ausgewählt. 2. Lösung funktioniert wie erwartet, danke – Energizem

1

Sie werden von Post.Id zum Gruppieren nach

SELECT Post.Id, Post.Name, Post.Message, 
SUM(CASE WHEN Comment.Id IS NOT NULL THEN 1 END) as Comments 
FROM Post 
LEFT JOIN Comment ON Post.Id = PostId 
GROUP BY Post.Id, Post.Name, Post.Message 
ORDER BY Comments DESC 
+1

@Energizem Ich werde ändern, um eine 'LINKE JOIN' zu verwenden, die den Trick tun sollte. – wogsland