• ベストアンサー

1対Nの時の、テーブル構成・カラム構成を教えて

ブログの1エントリーを、複数カテゴリーに属するようにしたいです。 ■テーブル構成? ・「エントリーテーブル」「カテゴリーテーブル」 ・エントリーテーブルの1カラムで、属する「カテゴリーid」を保存するのでしょうか。例えば「2,3」みたいに ・この時、あるカテゴリーに属するエントリーをSELECTするにはどうすれば良いでしょうか?

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

> ・エントリーに属するすべてのカテゴリーデータを取得するにはどうすれば良いでしょうか? 構造的にはエントリーテーブルとカテゴリーマスターテーブルは対称になるので、#1で例示したSQLのテーブル名やカラム名をカテゴリー関係に入れ替えるだけで出来ますよ。 SELECT DISTINCT cm.* FROM カテゴリーマスターテーブル cm LEFT OUTER JOIN エントリー所属カテゴリーテーブル ec ON (cm.カテゴリーID = ec.カテゴリーID) WHERE ec.エントリーID = 101 テーブル間の構造が把握できない場合はER図などを書いてみると良いでしょう。 > ・例えば、一旦複数レコードとして取得後、スクリプト側で文字列連結とかして、1カラムのようにして、1レコード表示するのでしょうか? > ・希望としては、エントリー毎に、属しているすべてのカテゴリー名とかを表示させたいです ??? エントリー毎に1行出力して、ひも付く全カテゴリーをその行に含めたいという事でしょうか? そうだとしたら、GROUP_CONCAT を使えば良いでしょう。 SELECT cm.*, GROUP_CONCAT(et.件名) FROM カテゴリーマスターテーブル cm LEFT OUTER JOIN エントリー所属カテゴリーテーブル ec ON (cm.カテゴリーID = ec.カテゴリーID) RIGHT OUTER JOIN エントリーテーブル et ON (ec.エントリーID = et.エントリーID) GROUP BY cm.カテゴリーID ORDER BY cm.カテゴリーID 複数行が良いのなら、結合してカテゴリーID順にソートすれば良いでしょう。 SELECT cm.*, et.* FROM カテゴリーマスターテーブル cm LEFT OUTER JOIN エントリー所属カテゴリーテーブル ec ON (cm.カテゴリーID = ec.カテゴリーID) RIGHT OUTER JOIN エントリーテーブル et ON (ec.エントリーID = et.エントリーID) ORDER BY cm.カテゴリーID

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html#function_group-concat
re97
質問者

お礼

回答ありがとうございました。 おかげでやりたいことが実現できました。 >エントリー毎に1行出力して、ひも付く全カテゴリーをその行に含めたいという事でしょうか? ・はい。拙い質問の意向を汲み取っていただきありがとうございます >GROUP_CONCAT ・初めて知りました。こんなことが出来るとは思いませんでした ・参考リンクも提示いただき、大変参考になりましたー

その他の回答 (1)

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

> ブログの1エントリーを、複数カテゴリーに属するようにしたいです。 1つのカテゴリーには一つのエントリーしか属さないわけではないですよね? だとすると、多対多になります。 1エントリーは複数のカテゴリーに属し、一つのカテゴリーには複数のエントリーが属すると。 オーソドックスなやり方だと3つテーブルを作る事になるかと。 例) ------------------------------------------ ■ エントリーテーブル  エントリーID (主キー), 件名, 本文, ・・・・ ■ カテゴリーマスターテーブル  カテゴリーID (主キー), カテゴリー名, ・・・・ ■ エントリー所属カテゴリーテーブル  エントリーID, カテゴリーID  (2カラムで複合主キー) ---------------------------------------------- 上記の様なテーブル構成だと、下記の様なSQLで特定のカテゴリーに属するエントリーが取得できます。 SELECT DISTINCT et.* FROM エントリーテーブル et LEFT OUTER JOIN エントリー所属カテゴリーテーブル ec ON (et.エントリーID = ec.エントリーID) WHERE ec.カテゴリーID = 1

参考URL:
http://gihyo.jp/dev/feature/01/database/0003
re97
質問者

補足

回答ありがとうございました。 おかげで望む結果を得ることができたのですが、新たな疑問が… ・エントリーに属するすべてのカテゴリーデータを取得するにはどうすれば良いでしょうか? ・特に分からないのが、エントリーが複数カテゴリーに跨っているときです ・この場合、「エントリー所属カテゴリーテーブル」に同じエントリーIDレコードが複数あると思うのですが、どういう風に処理すれば良いのでしょうか? ・例えば、一旦複数レコードとして取得後、スクリプト側で文字列連結とかして、1カラムのようにして、1レコード表示するのでしょうか? ・希望としては、エントリー毎に、属しているすべてのカテゴリー名とかを表示させたいです

関連するQ&A