Daniel's Knowledge Storage

인기검색어 퀄리 방법 본문

Develop/PHP

인기검색어 퀄리 방법

다니엘SEO 2009. 8. 30. 20:56

popular 테이블에 다음과 같이 데이타가 담겨 있습니다.
테이블을 만드는 방법부터는 쿼리문 답변을 한 후에 추가로 하겠습니다.
지금 예제에서는 IP 는 여기서 필요가 없어서 NULL로 생략했습니다.

mysql> SELECT * FROM popular;

+-------+--------------+------------+-------+
| pp_id | pp_word      | pp_date    | pp_ip |
+-------+--------------+------------+-------+
|     1 | keyword      | 2008-10-29 | NULL  |
|     2 | keyword      | 2008-10-29 | NULL  |
|     3 | coreanpro    | 2008-10-28 | NULL  |
|     4 | keyword      | 2008-10-28 | NULL  |
|     5 | naver        | 2008-10-28 | NULL  |
|     6 | perlmania    | 2008-10-28 | NULL  |
|     7 | perlmania    | 2008-10-27 | NULL  |
|     8 | perlmania    | 2008-10-27 | NULL  |
|     9 | naver        | 2008-10-27 | NULL  |
|    10 | mysql        | 2008-10-27 | NULL  |
|    11 | coreanpro    | 2008-10-26 | NULL  |
|    12 | perlmania    | 2008-10-26 | NULL  |
|    13 | perl         | 2008-10-26 | NULL  |
|    14 | sql          | 2008-10-26 | NULL  |
|    15 | sql          | 2008-10-26 | NULL  |
|    16 | sql          | 2008-10-25 | NULL  |
|    17 | naver.com    | 2008-10-25 | NULL  |
|    18 | perlmania    | 2008-10-25 | NULL  |
|    19 | linux kernel | 2008-10-25 | NULL  |
|    20 | perlmania    | 2008-10-25 | NULL  |
|    21 | sql          | 2008-10-25 | NULL  |
|    22 | perlmania    | 2008-10-24 | NULL  |
|    23 | perlmania    | 2008-10-24 | NULL  |
|    24 | sql          | 2008-10-24 | NULL  |
|    25 | music list   | 2008-10-24 | NULL  |
|    26 | photoshop    | 2008-10-24 | NULL  |
|    27 | linux kernel | 2008-10-24 | NULL  |
|    28 | keyword      | 2008-10-29 | NULL  |
|    29 | permania     | 2008-10-29 | NULL  |
|    30 | permania     | 2008-10-29 | NULL  |
|    31 | permania     | 2008-10-29 | NULL  |
|    32 | permania     | 2008-10-29 | NULL  |
|    33 | mysql        | 2008-10-29 | NULL  |
|    34 | mysql        | 2008-10-29 | NULL  |
|    35 | sql          | 2008-10-29 | NULL  |
|    36 | linux kernel | 2008-10-29 | NULL  |
|    37 | photoshop    | 2008-10-29 | NULL  |
|    38 | photoshop    | 2008-10-29 | NULL  |
|    39 | keyword      | 2008-10-28 | NULL  |
|    40 | perlmania    | 2008-10-28 | NULL  |
|    41 | perlmania    | 2008-10-28 | NULL  |
|    42 | perlmania    | 2008-10-28 | NULL  |
|    43 | naver        | 2008-10-28 | NULL  |
|    44 | naver        | 2008-10-28 | NULL  |
|    45 | naver        | 2008-10-27 | NULL  |
|    46 | naver        | 2008-10-27 | NULL  |
|    47 | naver        | 2008-10-27 | NULL  |
|    48 | perlmania    | 2008-10-27 | NULL  |
|    49 | perlmania    | 2008-10-27 | NULL  |
|    50 | perlmania    | 2008-10-27 | NULL  |
|    51 | perl         | 2008-10-27 | NULL  |
|    52 | music list   | 2008-10-27 | NULL  |
|    53 | linux kernel | 2008-10-27 | NULL  |
|    54 | linux kernel | 2008-10-27 | NULL  |
|    55 | linux kernel | 2008-10-27 | NULL  |
|    56 | perlmania    | 2008-10-26 | NULL  |
|    57 | perlmania    | 2008-10-26 | NULL  |
|    58 | mysql        | 2008-10-26 | NULL  |
|    59 | ruby         | 2008-10-26 | NULL  |
|    60 | ruby         | 2008-10-26 | NULL  |
|    61 | naver.com    | 2008-10-26 | NULL  |
|    62 | naver.com    | 2008-10-25 | NULL  |
|    63 | naver.com    | 2008-10-25 | NULL  |
|    64 | naver.com    | 2008-10-25 | NULL  |
|    65 | naver        | 2008-10-25 | NULL  |
|    66 | perl         | 2008-10-25 | NULL  |
|    67 | perl         | 2008-10-25 | NULL  |
|    68 | perlmania    | 2008-10-25 | NULL  |
|    69 | perlmania    | 2008-10-25 | NULL  |
|    70 | perlmania    | 2008-10-25 | NULL  |
|    71 | perlmania    | 2008-10-25 | NULL  |
|    72 | perlmania    | 2008-10-25 | NULL  |
|    73 | mysql        | 2008-10-25 | NULL  |
|    74 | perlmania    | 2008-10-25 | NULL  |
|    75 | perl         | 2008-10-25 | NULL  |
|    76 | perlmania    | 2008-09-20 | NULL  |
|    77 | perlmania    | 2008-09-20 | NULL  |
|    78 | perlmania    | 2008-09-20 | NULL  |
|    79 | naver        | 2008-09-20 | NULL  |
|    80 | perlmania    | 2008-09-20 | NULL  |
|    81 | naver        | 2008-09-20 | NULL  |
|    82 | perlmania    | 2008-09-20 | NULL  |
|    83 | perlmania    | 2008-09-20 | NULL  |
|    84 | mysql        | 2008-09-20 | NULL  |
|    85 | mysql        | 2008-09-20 | NULL  |
|    86 | mysql        | 2008-09-20 | NULL  |
|    87 | mysql        | 2008-09-20 | NULL  |
|    88 | mysql        | 2008-09-20 | NULL  |
|    89 | mysql        | 2008-09-20 | NULL  |
|    90 | mysql        | 2008-09-20 | NULL  |
|    91 | mysql        | 2008-09-17 | NULL  |
|    92 | naver.com    | 2008-09-14 | NULL  |
|    93 | naver.com    | 2008-09-14 | NULL  |
|    94 | perlmania    | 2008-09-14 | NULL  |
|    95 | perlmania    | 2008-09-14 | NULL  |
|    96 | mysql        | 2008-10-10 | NULL  |
|    97 | naver        | 2008-10-10 | NULL  |
|    98 | naver        | 2008-10-10 | NULL  |
|    99 | naver        | 2008-10-10 | NULL  |
|   100 | naver        | 2008-10-10 | NULL  |
|   101 | mysql        | 2008-10-10 | NULL  |
|   102 | mysql        | 2008-10-10 | NULL  |
|   103 | mysql        | 2008-10-10 | NULL  |
|   104 | naver        | 2008-10-10 | NULL  |
|   105 | naver        | 2008-10-10 | NULL  |
+-------+--------------+------------+-------+
105 rows in set (0.00 sec)

이중에서 일주일 내에 분량만 가져오려면 이렇게 합니다.
CURDATE() 는 현재 날짜를 반환하는 함수이고, 현재날짜-7 보다 pp_date 가 큰 경우만
가져오도록 조건을 답니다.

mysql> SELECT * FROM popular WHERE pp_date >= CURDATE()-7;
+-------+--------------+------------+-------+
| pp_id | pp_word      | pp_date    | pp_ip |
+-------+--------------+------------+-------+
|     1 | keyword      | 2008-10-29 | NULL  |
|     2 | keyword      | 2008-10-29 | NULL  |
|     3 | coreanpro    | 2008-10-28 | NULL  |
|     4 | keyword      | 2008-10-28 | NULL  |
|     5 | naver        | 2008-10-28 | NULL  |
|     6 | perlmania    | 2008-10-28 | NULL  |
|     7 | perlmania    | 2008-10-27 | NULL  |
|     8 | perlmania    | 2008-10-27 | NULL  |
|     9 | naver        | 2008-10-27 | NULL  |
|    10 | mysql        | 2008-10-27 | NULL  |
|    11 | coreanpro    | 2008-10-26 | NULL  |
|    12 | perlmania    | 2008-10-26 | NULL  |
|    13 | perl         | 2008-10-26 | NULL  |
|    14 | sql          | 2008-10-26 | NULL  |
|    15 | sql          | 2008-10-26 | NULL  |
|    16 | sql          | 2008-10-25 | NULL  |
|    17 | naver.com    | 2008-10-25 | NULL  |
|    18 | perlmania    | 2008-10-25 | NULL  |
|    19 | linux kernel | 2008-10-25 | NULL  |
|    20 | perlmania    | 2008-10-25 | NULL  |
|    21 | sql          | 2008-10-25 | NULL  |
|    22 | perlmania    | 2008-10-24 | NULL  |
|    23 | perlmania    | 2008-10-24 | NULL  |
|    24 | sql          | 2008-10-24 | NULL  |
|    25 | music list   | 2008-10-24 | NULL  |
|    26 | photoshop    | 2008-10-24 | NULL  |
|    27 | linux kernel | 2008-10-24 | NULL  |
|    28 | keyword      | 2008-10-29 | NULL  |
|    29 | permania     | 2008-10-29 | NULL  |
|    30 | permania     | 2008-10-29 | NULL  |
|    31 | permania     | 2008-10-29 | NULL  |
|    32 | permania     | 2008-10-29 | NULL  |
|    33 | mysql        | 2008-10-29 | NULL  |
|    34 | mysql        | 2008-10-29 | NULL  |
|    35 | sql          | 2008-10-29 | NULL  |
|    36 | linux kernel | 2008-10-29 | NULL  |
|    37 | photoshop    | 2008-10-29 | NULL  |
|    38 | photoshop    | 2008-10-29 | NULL  |
|    39 | keyword      | 2008-10-28 | NULL  |
|    40 | perlmania    | 2008-10-28 | NULL  |
|    41 | perlmania    | 2008-10-28 | NULL  |
|    42 | perlmania    | 2008-10-28 | NULL  |
|    43 | naver        | 2008-10-28 | NULL  |
|    44 | naver        | 2008-10-28 | NULL  |
|    45 | naver        | 2008-10-27 | NULL  |
|    46 | naver        | 2008-10-27 | NULL  |
|    47 | naver        | 2008-10-27 | NULL  |
|    48 | perlmania    | 2008-10-27 | NULL  |
|    49 | perlmania    | 2008-10-27 | NULL  |
|    50 | perlmania    | 2008-10-27 | NULL  |
|    51 | perl         | 2008-10-27 | NULL  |
|    52 | music list   | 2008-10-27 | NULL  |
|    53 | linux kernel | 2008-10-27 | NULL  |
|    54 | linux kernel | 2008-10-27 | NULL  |
|    55 | linux kernel | 2008-10-27 | NULL  |
|    56 | perlmania    | 2008-10-26 | NULL  |
|    57 | perlmania    | 2008-10-26 | NULL  |
|    58 | mysql        | 2008-10-26 | NULL  |
|    59 | ruby         | 2008-10-26 | NULL  |
|    60 | ruby         | 2008-10-26 | NULL  |
|    61 | naver.com    | 2008-10-26 | NULL  |
|    62 | naver.com    | 2008-10-25 | NULL  |
|    63 | naver.com    | 2008-10-25 | NULL  |
|    64 | naver.com    | 2008-10-25 | NULL  |
|    65 | naver        | 2008-10-25 | NULL  |
|    66 | perl         | 2008-10-25 | NULL  |
|    67 | perl         | 2008-10-25 | NULL  |
|    68 | perlmania    | 2008-10-25 | NULL  |
|    69 | perlmania    | 2008-10-25 | NULL  |
|    70 | perlmania    | 2008-10-25 | NULL  |
|    71 | perlmania    | 2008-10-25 | NULL  |
|    72 | perlmania    | 2008-10-25 | NULL  |
|    73 | mysql        | 2008-10-25 | NULL  |
|    74 | perlmania    | 2008-10-25 | NULL  |
|    75 | perl         | 2008-10-25 | NULL  |
+-------+--------------+------------+-------+
75 rows in set (0.00 sec)

한편, 전체 날짜 중에서 검색어가 입력된 회수는 다음과 같이 알 수 있습니다.

mysql> SELECT pp_word,COUNT(pp_word) FROM popular GROUP BY pp_word;
+--------------+----------------+
| pp_word      | COUNT(pp_word) |
+--------------+----------------+
| coreanpro    |              2 |
| keyword      |              5 |
| linux kernel |              6 |
| music list   |              2 |
| mysql        |             17 |
| naver        |             16 |
| naver.com    |              7 |
| perl         |              5 |
| perlmania    |             30 |
| permania     |              4 |
| photoshop    |              3 |
| ruby         |              2 |
| sql          |              6 |
+--------------+----------------+
13 rows in set (0.00 sec)

이를 조합하면, 일주일 동안 검색어가 입력된 모든 회수를 구할 수 있습니다.

mysql> SELECT pp_word,COUNT(pp_word) FROM popular WHERE pp_date>=CURDATE()-7 GROUP BY pp_word;
+--------------+----------------+
| pp_word      | COUNT(pp_word) |
+--------------+----------------+
| coreanpro    |              2 |
| keyword      |              5 |
| linux kernel |              6 |
| music list   |              2 |
| mysql        |              5 |
| naver        |              8 |
| naver.com    |              5 |
| perl         |              5 |
| perlmania    |             22 |
| permania     |              4 |
| photoshop    |              3 |
| ruby         |              2 |
| sql          |              6 |
+--------------+----------------+
13 rows in set (0.00 sec)

ORDER BY count DESC 를 더해서 인기 순으로 정렬합니다.
ORDER BY count 를 하면 ORDER BY count ASC 와 같고 오름차순으로 정렬됩니다.
여기서는 내림차순이므로 DESC 를 사용합니다.

mysql> SELECT pp_word AS keyword, COUNT(pp_word) AS count FROM popular WHERE pp_date>=CURDATE()-7 GROUP BY pp_word ORDER BY count DESC;
+--------------+-------+
| keyword      | count |
+--------------+-------+
| perlmania    |    22 |
| naver        |     8 |
| sql          |     6 |
| linux kernel |     6 |
| keyword      |     5 |
| mysql        |     5 |
| perl         |     5 |
| naver.com    |     5 |
| permania     |     4 |
| photoshop    |     3 |
| coreanpro    |     2 |
| music list   |     2 |
| ruby         |     2 |
+--------------+-------+
13 rows in set (0.00 sec)

LIMIT 4 를 추가하여 4개만 가져옵니다.

mysql> SELECT pp_word AS keyword, COUNT(pp_word) AS count FROM popular WHERE pp_date>=CURDATE()-7 GROUP BY pp_word ORDER BY count DESC LIMIT 4;
+--------------+-------+
| keyword      | count |
+--------------+-------+
| perlmania    |    22 |
| naver        |     8 |
| sql          |     6 |
| linux kernel |     6 |
+--------------+-------+
4 rows in set (0.01 sec)

만약에 인기 수치를 가져오고 싶지 않다면 생략하는 것이 좋겠지요.

mysql> SELECT pp_word AS keyword FROM popular WHERE pp_date>=CURDATE()-7 GROUP BY pp_word ORDER BY COUNT(pp_word) DESC LIMIT 4;
+--------------+
| keyword      |
+--------------+
| perlmania    |
| naver        |
| sql          |
| linux kernel |
+--------------+
4 rows in set (0.00 sec)


음...
perlmania 가 1위군요... 후훗...

***************************************************************
Comments