• ベストアンサー

テーブルの結合について教えてください。

テーブルの結合についてわからなくなってしまったので、教えてください。 次のようなテーブルがあります。 counterテーブル ・page_no ・cnt pageテーブル ・no ・member_no linkテーブル ・page_no ・member_no memberテーブル ・no ・name ・flag 各ページにカウンタがついている。 各ページは作成したメンバが記録されている 各ページにはリンクがはられてあり、そのリンクを作成したメンバが記録されている。 各メンバには、退会を示すflagがあり、flag=0が会員、flag=1が退会を示す。 以上のような条件で、 退会していないメンバが関係するページのnoとカウンタの値を取得したい (関係とは、メンバが作ったorリンクを貼った という意味です) のですが、どのように記述すればよいのでしょうか? 自力で考えようとしたのですが、力尽きました。 すみませんが、ご教授お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

#2回答者です。 カウンタ値を取り出していなかったので、先頭のselectのみ変更します。 【SQL例】 select no as mno,name,p.pno,c.cnt from member as m left join (select page_no as pno,member_no as mno from page union select page_no as pno,member_no as mno from link) as p on m.no=p.mno left join counter as c on p.pno=c.page_no where m.flag=0 ;

xyz_1990
質問者

お礼

ご回答ありがとうございます。 unionを使えば良いのですね。勉強にないりました。 それで、私が意図していたsqlは次のようなものになりそうです。 select page.no as p_no, counetr.cnt as cnt from (page inner join counter on page.no=counter.page_no) inner join member on page.member_no=member.no where member.flag = 0 union select page.no as p_no, counetr.cnt as cnt from ((page inner join page.no=counter.page_no) inner join link on page.no=link.page_no) inner join member on link.member_no=member.no where member.flag = 0 【追加質問】 すみんせん。質問用に簡略化しすぎていました。 ANo2でおっしゃられていたように、この例だとcounterとpageを分離する意味がないのですが、 本来は、日毎に集計されるようにしていました。 counterテーブル ・page_no ・date_no ・cnt この場合、上のsqlに対し、 counetr.cnt as cnt の部分を sum(counetr.cnt) as cnt に変更したいのですが、 このようなことはできるのでしょうか? できるなら、その構文を教えていただけないでしょうか? あと、mysqlのバージョンは、4.0.27です。

その他の回答 (2)

回答No.2

MySQLの質問をする場合は、お使いのバージョンを書きましょう。 せっかく具体的なSQLを提示してもらっても、あなたの環境では動かないということがあり得ます。 各表間の列データの関連を、具体的に書いてください。 >各ページにカウンタがついている 更新カウンタという意味ですか? page表とcounter表は、別表にする理由は何ですか? page表の行と、counter表の行は、1対1で対応するのでは? >各ページにはリンクがはられてあり、そのリンクを作成したメンバが記録されている page表にはあるが、link表には対応行がない場合も、1行以上ある場合もあるのですね? データの関連を推測して、検索SQL例を作ってみました。 【SQL例】 select no as mno,name,p.pno from member as m left join (select page_no as pno,member_no as mno from page union select page_no as pno,member_no as mno from link) as p on m.no=p.mno left join counter as c on p.pno=c.page_no where m.flag=0 ;

  • kainan
  • ベストアンサー率0% (0/1)
回答No.1

AccessのSQLですが・・・見先のテーブルを変えないといけないような気がするので、UNIONにしてみました。 SELECT member.flag, member.name, page.[no] AS page_no, counter.cnt, "page" AS categoly FROM (member INNER JOIN page ON member.[no] = page.member_no) INNER JOIN [counter] ON page.[no] = counter.page_no WHERE (((member.flag)=0)) Union SELECT member.flag, member.name, link.page_no, counter.cnt, "link" AS categoly FROM (member INNER JOIN link ON member.[no] = link.member_no) INNER JOIN [counter] ON link.page_no = counter.page_no WHERE (((member.flag)=0));

xyz_1990
質問者

お礼

ご回答ありがとうございます。 unionを使えば、良いということが分かり、大変勉強になりました。 あと、状況はANo3のお礼の欄に書いたとおりです。 よろしくお願いいたします。

関連するQ&A