次の表を使用して、サイトのすべての訪問者を追跡しています。
私の管理パネルには、どの国が私のサイトを訪れたのか、どこから来たのかについての概要があります...しかし、20以上の異なる国がすでに私のサイトを訪問しているため、グラフは次のようになります。
これを解決するために、私は上位5か国を選択したいと思いますが、これを行う方法についての手がかりはありません。
LIMITとCOUNTを使ってみましたが、うまくいきませんでした。
問題を複数のステップに分けることができます。
最初に、サンプルテーブルを作成します。
MySQL 5.5.32スキーマのセットアップ:
CREATE TABLE Visitors(
id INT,
-- other columns
country CHAR(2)
);
INSERT INTO Visitors(id,country)VALUES(1,'DE');
INSERT INTO Visitors(id,country)VALUES(2,'DE');
INSERT INTO Visitors(id,country)VALUES(3,'DE');
INSERT INTO Visitors(id,country)VALUES(4,'BE');
INSERT INTO Visitors(id,country)VALUES(5,'BE');
INSERT INTO Visitors(id,country)VALUES(6,'BE');
INSERT INTO Visitors(id,country)VALUES(7,'BE');
INSERT INTO Visitors(id,country)VALUES(8,'BE');
INSERT INTO Visitors(id,country)VALUES(9,'BE');
INSERT INTO Visitors(id,country)VALUES(10,'US');
INSERT INTO Visitors(id,country)VALUES(11,'US');
INSERT INTO Visitors(id,country)VALUES(12,'US');
INSERT INTO Visitors(id,country)VALUES(13,'US');
INSERT INTO Visitors(id,country)VALUES(14,'HR');
INSERT INTO Visitors(id,country)VALUES(15,'HR');
INSERT INTO Visitors(id,country)VALUES(16,'SE');
INSERT INTO Visitors(id,country)VALUES(17,'SE');
INSERT INTO Visitors(id,country)VALUES(18,'SE');
INSERT INTO Visitors(id,country)VALUES(19,'SE');
INSERT INTO Visitors(id,country)VALUES(20,'RU');
最初のステップは、GROUP BY
句を使用して国ごとのインプレッションをカウントすることです。
クエリ1:
SELECT country,COUNT(1) cnt
FROM Visitors
GROUP BY country
結果:
| COUNTRY | CNT |
-----------------
| BE | 6 |
| DE | 3 |
| HR | 2 |
| RU | 1 |
| SE | 4 |
| US | 4 |
そこから、LIMIT
を使用して上位5か国を取得できます。
クエリ2:
SELECT *
FROM(
SELECT country,COUNT(1) cnt
FROM Visitors
GROUP BY country
)V
ORDER BY cnt DESC
LIMIT 5
結果:
| COUNTRY | CNT |
-----------------
| BE | 6 |
| SE | 4 |
| US | 4 |
| DE | 3 |
| HR | 2 |
次に、結果をビジターテーブルに結合する必要があります。
クエリ3:
SELECT V.*,c.cnt
FROM Visitors V
JOIN(
SELECT *
FROM(
SELECT country,COUNT(1) cnt
FROM Visitors
GROUP BY country
)V
ORDER BY cnt DESC
LIMIT 5
)C
ON V.country = C.country
結果:
| ID | COUNTRY | CNT |
----------------------
| 1 | DE | 3 |
| 2 | DE | 3 |
| 3 | DE | 3 |
| 4 | BE | 6 |
| 5 | BE | 6 |
| 6 | BE | 6 |
| 7 | BE | 6 |
| 8 | BE | 6 |
| 9 | BE | 6 |
| 10 | US | 4 |
| 11 | US | 4 |
| 12 | US | 4 |
| 13 | US | 4 |
| 14 | HR | 2 |
| 15 | HR | 2 |
| 16 | SE | 4 |
| 17 | SE | 4 |
| 18 | SE | 4 |
| 19 | SE | 4 |