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

mysql:7677

From: yuji koga <yuji koga <koga-y@xxxxxxxxxx>>
Date: Fri, 09 May 2003 19:46:06 +0900
Subject: [mysql 07677] 4 つのテーブルを left join するには(長文)

お世話になります。古賀と申します。
非常に長くなってしまいましたが、宜しくお願い致します。

環境:mySQL3.23.49(not MAX)、PHP4.3.1、Apache1.3.27 Linux
   (以上、レンタルサーバーです)

質問:
現在、普通の(スレッドでない)ファイルアップBBSを、
(例えば2chのように)複数管理出来るPHPを制作中です。
その中で、BBSの一覧を表示するSQL文で詰まってしまい、
にっちもさっちも行かなくなってしまいました。

用意したテーブルは(投稿用に省略してますが)以下の通りです。

# アクセスログを記録するテーブル
acc_tbl
--------------------
acc_id  :プライマリキー
usr_id  :アクセスした人のID
thrd_id :アクセスされたスレッドのID
acc_ua :アクセスのユーザーエージェント
acc_datetime :アクセス日時


# BBS記事とファイル名を記録するテーブル(画像は1記事1枚です)
file_tbl
--------------------
file_id :プライマリキー
file_nm :アップされたファイル名
file_ttl :記事のタイトル
file_note :記事
file_datetime :カキコ日時
usr_id :書いた人のID
thrd_id :この記事が属するBBSのID


# BBSの名前や開設者を記録するテーブル
thrd_tbl
--------------------
thrd_id :プライマリキー
thrd_ttl :BBSの名前
usr_id :このBBSを開設した人のID


# BBSの名前や備考を記録するテーブル
usr_tbl
--------------------
usr_id :プライマリキー
usr_lgnm :ログインネーム
usr_pw :ログインパスワード
usr_auth :権限(usrとかadminとか)


いくつかのダミーレコードをinsertした後、
まず以下のようなBBS一覧を求めました。
(書込人数は、書込件数ではなく、「何人が書き込んだか?」です)

thrd_id thrd_ttl usr_id アクセス数 書込人数 最終更新日時
------+-------+------+--------+------+--------
1          風景BBS  2          0             0           (日時・略)
2          車BBS     1          3             2           (日時・略)
      ・
      ・
      ・
   (最終カキコ時間順)

この時打ったSQLは、以下の通りです。

select 
thrd_tbl.thrd_id,
thrd_tbl.thrd_ttl,
thrd_tbl.usr_id,
count(distinct acc_tbl.acc_id),
count(distinct file_tbl.usr_id),
max(file_tbl.file_datetime)
from thrd_tbl 
left join acc_tbl using(thrd_id)
left join file_tbl using(thrd_id)
group by thrd_tbl.thrd_id
order by 'max(file_tbl.file_datetime)' desc ;


以上、前置きが長くなりましたが、ここからが本題です。

ここで、伝言板の管理者の名前も出そうとして苦しんでいます。
期待している結果は次です。

thrd_id thrd_ttl usr_lgnm アクセス数 書込人数 最終更新日時
------+-------+---------+--------+------+--------
2          車BBS     hoge           3             2           (日時・略)
1          風景BBS  koga           0             0           ----
      ・
      ・
      ・
   (最終更新日時順)

ここで次のようなSQLを打ちました。

select 
thrd_tbl.thrd_id,
thrd_tbl.thrd_ttl,
usr_tbl.usr_lgnm,
count(distinct acc_tbl.acc_id),
count(distinct file_tbl.usr_id),
max(file_tbl.file_datetime)
from thrd_tbl 
left join acc_tbl using(thrd_id)
left join file_tbl using(thrd_id)
left join usr_tbl using(usr_id)
group by thrd_tbl.thrd_id
order by 'max(file_tbl.file_datetime)' desc

しかしながら、この結果は次のようになりました。

thrd_id thrd_ttl usr_lgnm アクセス数 書込人数 最終更新日時
------+-------+---------+--------+------+--------
2          車BBS     hoge           3             2           (日時・略)
1          風景BBS  ----           0             0            ----
      ・
      ・
      ・
   (最終更新日時順)

アクセス数・書込数ともにゼロである、風景BBSの管理者がnullとなりました。
原因は left join の順番かな?と思い、

select 
thrd_tbl.thrd_id,
thrd_tbl.thrd_ttl,
usr_tbl.usr_lgnm,
count(distinct acc_tbl.acc_id),
count(distinct file_tbl.usr_id),
max(file_tbl.file_datetime)
from thrd_tbl 
left join usr_tbl using(usr_id)  <-入れ替わってます
left join acc_tbl using(thrd_id)    
left join file_tbl using(thrd_id)
group by thrd_tbl.thrd_id
order by 'max(file_tbl.file_datetime)' desc

とすると、今度は

Unknown column 'usr_tbl.thrd_id' in 'on clause'

というエラーが出てしまいます。why?
以上、非常に長くなってしまい恐縮ですが、ご助言頂ければ幸いです。



<? /*
株式会社メディアプレス   制作課  古賀裕二
       会社:koga-y@xxxxxxxxxx
       自宅:yuuukunn@xxxxxxxxxx
*/ ?>


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

->    7677 2003-05-09 19:46 [yuji koga <koga-y@xx] 4 つのテーブルを left join するには(長文)
      7680 2003-05-10 12:14 ┗[とみたまさひろ <tomm]                                       
      7681 2003-05-10 16:16  ┗[yuji koga <koga-y@xx]                                     
      7682 2003-05-10 17:48   ┗[とみたまさひろ <tomm]                                   
      7683 2003-05-10 20:41    ┗[yuji koga <koga-y@xx]                                 
      7685 2003-05-12 17:35     ┗[Hiroshi Honda <honda] MySQL で多言語使用            
      7692 2003-05-13 15:36      ┗[Joel Rees <joel@xxxx]                             
      7698 2003-05-13 21:50       ┗[tateyan <tateyan@xxx]                           
      7699 2003-05-14 08:31        ┣[Hiroshi Honda <honda]                         
      7719 2003-05-14 23:18        ┃┗[tateyan <tateyan@xxx]                       
      7712 2003-05-14 19:11        ┗[Joel Rees <joel@xxxx]