2017-02-16 10 views
0

私は2つのテーブルを持っています.1つは "投稿"で、他は投稿からの外部キーを持つ "コメント"です。それは、ほとんどのコメントがあると、ほとんどのコメントPHP MySQLの外部キーの並べ替え

ポスト表

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

コメントテーブルによって投稿を表示する方法 は、PostIdは、ID 2でソートされますフロントエンドページの記事で

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

キー外国人であります、1、ポストID 2を最後に指定します。 GurVへ

ソリューションTHX:

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

を接合した後Post.Idでグループする必要があります。何かを試してください。 – Strawberry

+1

実際に何か試したことがありますか? – Option

答えて

2

あなたはサブクエリで各ポストのコメントの数を見つけ、見つかったカウントにソートを実行するために支柱テーブルとそれに参加することができます。

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; 

すべての投稿を取得しようとしている場合は、上記のものが取得できる最速のものになります。

いくつかの投稿の場合は、相関クエリを使用して数を見つけて並べ替えることができます。

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

テーブルが非常に大きくなるとどうなりますか?これによりパフォーマンスが低下する可能性があります – Energizem

+1

@Energizem - 詳細と代替ソリューションで更新 – GurV

+0

1番目のソリューションは1つ以上のコメントの投稿のみを表示し、0のコメントは投稿されません。 2番目の解決策は期待どおりに動作します、ありがとうございます – Energizem

1

あなたはさあ

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トリックを行うべきLEFT JOINを使うように修正します。 – wogsland