2017-03-24 1 views
0

Die unten ist einer meiner Tabelle, namens board.MySQL - Ist es möglich, COUNT, GROUP BY und JOIN so zu verwenden?

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 

Und zwei Arten von Daten sind in dieser Tabelle, Artikel und Antwort gespeichert.
Nur Antworttyp hat eine article_id; Der Artikeltyp hat in der Artikel-ID nur einen Nullwert.

Was ich tun möchte, ist:
1. Zählen Sie die Anzahl der Antwort für jeden Artikel.
2. Holen info (Titel und Inhalt) der Top-5-Artikel des 1.

ich die 1 wie folgt zählen:

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

Nun, ich kenne die Top-5-id Artikel.
Aber ich habe keine Ahnung, wie ich die Artikel-Informationen mit diesen IDs bekommen kann.
Ich suchte und fand, dass es eine Join-Funktion gibt, aber kann ich es für die gleiche Tabelle verwenden?
Das Ergebnis erwarte ich, ist dies:

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

Oder sollte ich einen anderen Weg finden?

Antwort

0

Sie können eine Tabelle mit sich selbst verbinden. Sie müssen jedoch Tabellenaliase verwenden und sie als Präfix für Spaltennamen verwenden.

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

Vielen Dank. Es funktioniert super! – KimNR

0

Ich konnte einen Anruf wie dieses auf einem Projekt vor einer Weile erreichen. Was Sie tun müssen, ist einen Anruf in einen Join zu verschachteln (siehe unten).

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

Danke auch. Ihre Antwort hat mir auch sehr geholfen! – KimNR