- ベストアンサー
1対Nの時の、テーブル構成・カラム構成を教えて
ブログの1エントリーを、複数カテゴリーに属するようにしたいです。 ■テーブル構成? ・「エントリーテーブル」「カテゴリーテーブル」 ・エントリーテーブルの1カラムで、属する「カテゴリーid」を保存するのでしょうか。例えば「2,3」みたいに ・この時、あるカテゴリーに属するエントリーをSELECTするにはどうすれば良いでしょうか?
- みんなの回答 (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
その他の回答 (1)
- root139
- ベストアンサー率60% (488/809)
> ブログの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
補足
回答ありがとうございました。 おかげで望む結果を得ることができたのですが、新たな疑問が… ・エントリーに属するすべてのカテゴリーデータを取得するにはどうすれば良いでしょうか? ・特に分からないのが、エントリーが複数カテゴリーに跨っているときです ・この場合、「エントリー所属カテゴリーテーブル」に同じエントリーIDレコードが複数あると思うのですが、どういう風に処理すれば良いのでしょうか? ・例えば、一旦複数レコードとして取得後、スクリプト側で文字列連結とかして、1カラムのようにして、1レコード表示するのでしょうか? ・希望としては、エントリー毎に、属しているすべてのカテゴリー名とかを表示させたいです
お礼
回答ありがとうございました。 おかげでやりたいことが実現できました。 >エントリー毎に1行出力して、ひも付く全カテゴリーをその行に含めたいという事でしょうか? ・はい。拙い質問の意向を汲み取っていただきありがとうございます >GROUP_CONCAT ・初めて知りました。こんなことが出来るとは思いませんでした ・参考リンクも提示いただき、大変参考になりましたー