2017-03-24 11 views
0

以下は私のテーブル、boardという名前です。MySQL - このようにCOUNT、GROUP BY、JOINを使用できますか?

id int unsigned not null primary key auto_increment, 
board_name varchar(10) not null, 
type varchar(10) not null, 
article_id int unsigned, 
title varchar(255) not null, 
content text not null 

このテーブルには、記事と返信の2種類のデータが格納されています。
返信タイプのみがarticle_idを持ちます。記事タイプはarticle_idにヌル値のみを持ちます。

私がしたいことは次のとおりです。
1.各記事の回答数を数えます。
2. 1.

の上位5品の情報(タイトルや内容)を取得します私はこのような1を数えることができます。

select article_id, count(*) as count from board 
where article_id is not null group by article_id order by count desc limit 5; 

+------------+-------+ 
| article_id | count | 
+------------+-------+ 
|   12 |  7 | 
|   3 |  5 | 
|   6 |  3 | 
|   11 |  2 | 
|   1 |  1 | 
+------------+-------+ 

、私はトップ5の記事IDを知っています。
しかし、これらのIDを使用して記事の情報をどのように入手できるかはわかりません。
私は検索して、結合機能があることを発見しましたが、私は同じテーブルのために使用できますか?
私が期待した結果がこれです:

+------------+-------+-------+---------+ 
| article_id | count | title | content | 
+------------+-------+-------+---------+ 
|   12 |  7 |  |   | 
|   3 |  5 |  |   | 
|   6 |  3 |  |   | 
|   11 |  2 |  |   | 
|   1 |  1 |  |   | 
+------------+-------+-------+---------+ 

それとも私はいくつかの他の方法を見つける必要がありますか?

答えて

0

テーブル自体を結合することができます。しかし、テーブルのエイリアスを使用し、カラム名の接頭辞として使用する必要があります。

select a.*, count(*) as count 
from board as r -- r is alias (reply) 
join board as a on a.id = r.article.id 
where r.article_id is not null 
group by r.article_id 
order by count desc 
limit 5; 
+0

ありがとうございます。それは素晴らしい作品です! – KimNR

0

私はこのような呼び出しをプロジェクトの中でしばらくやり直すことができました。あなたがしなければならないことは、参加の呼び出しを入れ子にすることです(下記参照)。

SELECT b.title, b.content, b.article_id, b2.count 
FROM board b 
LEFT JOIN (
    SELECT article_id, COUNT(id) AS count 
    FROM board 
    WHERE article_id IS NOT null 
    GROUP BY article_id 
) b2 ON b2.article_id = b.id 
ORDER BY b2.count DESC 
LIMIT 5; 
+0

ありがとうございます。あなたの答えはまた私を助けました! – KimNR

関連する問題