[前][次][番号順一覧][スレッド一覧]

mysql:1430

From: Takanori Tobe <Takanori Tobe <database@xxxxxxxxxx>>
Date: Sat, 25 Dec 1999 15:14:21 +0900
Subject: [mysql 01430] Re: 該当件数を 2 つのテーブルから参照し表示する方法

とべ%MySQL学習中 です。

On Sat, 25 Dec 1999 09:44:24 +0900
"Isamu Narimatsu" <isamu@xxxxxxxxxx> wrote:

>成松です。Win98でMySQLを使用しています。
>ウェブサイトにバナーを表示する度、そして、バナーをクリックする度にMySQLにそ
>の会社コード等からなるレコードを追加しようと思います。
>そして、バナーのPV(表示回数)および、クリック数をクエリーで調べようと思いま
>す。

まず確認しておきたいのですが、それぞれのカラムの意味は
   id : ユニークキーを作るためで処理上の意味はない。
   comid : 表示/クリックされた会社コード
   1クリック or 表示ごとに新しく行をInsert
でよいのですよね。

結論から言うとこのテーブルの構成だとMySQLでは難しいのではないでしょうか。
なぜかというと、たとえば以下のようなレコードがあったとします。

 bpvlog             bclicklog
   +-------------+    +-------------+
   | id  | comid |    | id  | comid |
   +-------------+    +-------------+
   | 1   | 100   |    | 1   | 200   |
   | 2   | 200   |    | 2   | 100   |
   | 3   | 200   |    | 3   | 100   |
   | 4   | 200   |    +-------------+
   | 5   | 300   |
   +-----+-------+

この2つのテーブルを単純にJoinすると

   +------+-------+------+-------+
   |bpvlog        | bclicklog    |
   | id   | comid | id   | comid |
   +------+-------+------+-------+
   |    1 |   100 |    1 |   200 |
   |    2 |   200 |    1 |   200 |  #
   |    3 |   200 |    1 |   200 |  #
   |    4 |   200 |    1 |   200 |  #
   |    5 |   300 |    1 |   200 |
   |    1 |   100 |    2 |   100 |
   |    2 |   200 |    2 |   100 |
   |    3 |   200 |    2 |   100 |
   |    4 |   200 |    2 |   100 |
   |    5 |   300 |    2 |   100 |
   |    1 |   100 |    3 |   100 |   #
   |    2 |   200 |    3 |   100 |
   |    3 |   200 |    3 |   100 |
   |    4 |   200 |    3 |   100 |
   |    5 |   300 |    3 |   100 |
   +------+-------+------+-------+

となります。

>ここで、以下のようにSQL文を作成しました。
>
>select count(bpvlog.comid),count(bclicklog.comid) from bpvlog,bclicklog
>
ここでこのSQL文を発行しても上の表のbpvlog.comidとbclicklog.comidともに
値の入っている行数は等しくなっています。そのため結果の行数が等しく
なってしまいます。

>where 文で bpvlog.comid=bclicklog.comid としても右の値も左の値も同じになって
>しまいます。

where句にこの条件を追加しても上の表で"#"をつけたレコードだけが抽出される
ので結果的に両方の値は等しくなります。

>解決策としてはどのような、方法が考えられるのでしょうか?
>

Oracleとかのsubselectが使えるDBMSだったら、会社マスタを"M"として
  select (select count(*) from bpvlog where comid = M.comid),
         (select count(*) from bclicklog where comid = M.comid)
    from M
といった感じでできると思うのですがmySQLではまだ未対応かな?
3.23からsubselectに対応するような記述があったけどどうなのでしょう。

MySQLでやるとしたら中間に集計テーブルを用意して

 bpvcount
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| comid    | int(11)          |      | PRE |         |                |
+----------+------------------+------+-----+---------+----------------+
| cnt      | int(11)          | YES  |     |  Null   |                |
+----------+------------------+------+-----+---------+----------------+

 bclickcount
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| comid    | int(11)          |      | PRE |         |                |
+----------+------------------+------+-----+---------+----------------+
| cnt      | int(11)          | YES  |     |  Null   |                |
+----------+------------------+------+-----+---------+----------------+

INSERT INTO bpvcount 
  SELECT comid, count(*) FROM bpvlog GROUP BY comid;

INSERT INTO bclickcount 
  SELECT comid, count(*) FROM bpvlog GROUP BY comid;

としたあとで
 SELECT bpvcount.comid, bpvcount.cnt, bclickcount.cnt
   FROM bpvcount LEFT OUTER JOIN bclickcount 
           ON bpvcount.comid = bclickcount.comid;

でcomidごとの表示数とクリック数が集計できるとおもいます。
ただしこの文では一度も表示されずにクリックだけされたcomidがないことを
前提としています。

あとはテーブル自体の構成を変えて

blog(記録テーブル)
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(10) unsigned |      | PRI | 0       | auto_increment |
| comid    | int(11)          | YES  |     | NULL    |                |
| pv       | int              | YES  |     | NULL    |                |
| click    | int              | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
というようなテーブルにして
 表示だったら (pv,click)を(1,Null)
 クリックだったら (pv,click)を(Null,1)
というようにすると

SELECT id, count(pv), count(click)
  FROM blog
  GROUP BY id;

といった感じで表示できると思います。

-----
  戸部 貴紀 <takanori@xxxxxxxxxx>

>


[前][次][番号順一覧][スレッド一覧]

      1428 1999-12-25 09:44 ["Isamu Narimatsu" <i] 該当件数を 2 つのテーブルから参照し表示する方法
->    1430 1999-12-25 15:14 ┗[Takanori Tobe <datab]