• ベストアンサー

重複したフィールドに関して

こんばんは。お世話になっております。 PHPにてMySQLを用いて掲示板のようなものを作成しているのですが、初心者なりの考えで、新規投函のときに、あるフィールドにUNIXタイムスタンプを登録し、返信に関しては初回投函した際のタイムスタンプを登録する事により、スレッドを分別しようと考えております。 出来上がりのイメージとしては、この「教えて!goo」のように、初回投函したタイトルを一覧表示し、その先にその件に関する回答が表示させたいと思います。 先にも述べたように、初心者なりの考えで、新規投函・回答・返信、すべて新規レコードを追加という流れで、タイムスタンプによる同一の数値により、新規投函か否か、と分別できれば・・と考えておりました。 しかし、初心者故にか、普段用いている下記コードでは、全てのレコードが対象となってしまい、同一の数値(タイムスタンプ)による分別(初回投函のみを検索結果として表示させたい)が出来ない事に気付きました。 フィールドの考え方も含めて、ご教授いただけたら幸いです。お忙しい中恐縮ですが宜しくお願い致します。 mysql_connect('localhost','root','*****'); mysql_select_db('test'); $sql= "select * from member_bbs where id = '$id'; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows <> 0){ while($row = mysql_fetch_array($result)){    ・    ・    ・ MYSQL(カテゴリー)での質問かとも思いましたが・・・宜しくお願い致します。

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

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.3

がるです。 ちぃとテーブル構造一気に作り変えてみます(苦笑 id int Key auto_increment これは概ねこのままで。ただ、「新規投函・回答・返信」を全部一意にあつかいます。 # 個人的には「charでトークナイザ(ユニークな文字列を作成するクラス)」を使うのですが。 # とりあえずintサイズくらいあれば問題ないかと。 date datetime 日付は、やはりdatetime型が一番扱いやすいです。 keyrandam 削除 これは使わずに削除してしまいます。理由は後述。 answering_agency_id int default -1 回答元ID。もし投稿が「回答」だった場合に、その元記事になるもののidをココに設定します。 reply_agency_id int default -1 返信元ID。もし投稿が「返信」だった場合に、その記事元になるもののidをここに設定します。 subject以下は概ねそのままでよろしいのかなぁ、と。 こうやりますと。例えば「投稿記事」だけを引っ掛けたい場合、 answering_agency_id = -1 and reply_agency_id = -1 で引っかかりますし。「回答のみ」を引っ掛けたいのなら、 answering_agency_id = 回答元の記事のid で片付きます。 こんな風にすると大分に楽かと思うのですが、どうでしょうか?

sadacha
質問者

お礼

がる様 こんにちは。お世話になっております。 返信が送れて申し訳ありません。只今アドバイスの内容を拝見させていただきました。 取り急ぎ、お礼も兼ねてご挨拶とさせて頂きますが、とても興味深い内容(テーブル設定)、改めて補足欄にて報告(お礼)をさせて頂きます。 きちんとアドバイス頂いた内容を自分でも考えたいので・・・宜しくお願い致します。

sadacha
質問者

補足

がる様 こんばんは。報告ではないのですが、アドバイスにある、 >answering_agency_id int default -1 とは、どういった事なのでしょうか? 検索して調べれば・・とは思っていたものの、調べ方が悪いのか、分からずじまいでして…(汗 がる様のアドバイス、39jin様のアドバイス共に印刷して流れを思い描きながら…とは思っていましたが、ココのところで突き当たってしまいました(汗)。お手数お掛けいたしますが宜しくお願い致します。

その他の回答 (3)

  • 39jin
  • ベストアンサー率34% (125/359)
回答No.4

教えてgooと同じ動作表示であれば >先にも述べたように、初心者なりの考えで、新規投函・回答・返信、すべて新規レコードを追加という流れで、タイムスタンプによる同一の数値により、新規投函か否か、と分別できれば・・と考えておりました。 ○この分に関しては、#3と同じdatetimeですが、カラムにNoとidを作成します 「新規投稿」と「投稿に対しての回答」とを区別する 新規投稿の「番号を持って」、回答すると「データが一つ増加」する >初心者故にか、普段用いている下記コードでは、全てのレコードが対象となってしまい、同一の数値(タイムスタンプ)による分別(初回投函のみを検索結果として表示させたい)が出来ない事に気付きました。 ○ここでNoとidを区別して表示させます 文章表現がうまくないですが、上の動作を数量的に判断します Noかidかを補助的に使います。質問に対しては量が増える。回答に対しては、質問番号を抱(かか)えてゆくです。 どちらかに対して+1が登録スクリプト上で必要になります 上のアドバイスはワン(1)テーブルを想定しています 質問テーブルと、回答テーブルを別途作成すればリレーションで解決できます 補足要求されてもこれ以上の難しいことは理解できていません。ただ教えてgooと同じようなプログラムはこの方式で完成して機能しています・・ 一覧表示をlook(タイトルをクリックしてviewへ) 詳細表示をview(回答全数も表示されます)

sadacha
質問者

お礼

39jin様 はじめまして、こんにちは。ご親切なアドバイスを有難う御座います。 下の、がる様へのお礼でも述べましたが、自分でもきちんと(アドバイスの基)考えたいので、取り急ぎご挨拶とさせて頂きますが、改めてご報告も兼ねて返信させて頂きたいと思います。有難う御座いました。

sadacha
質問者

補足

補足欄から失礼します。 まだまだ完成には程遠いもの、皆様の有難いアドバイスをヒントに、描いていた表示結果を得る事が出来ました! 完成(自分が描いているもの)までに躓き、また改めてご質問させていただく事もあるかもしれませんが、今回の投函、「重複したフィールドに関して」においては有難いアドバイスの基、満足のいく結果を得られたと思っております。皆様のご厚意に感謝しております。有難う御座いました!

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

回答とは異なりますが。 記事固有のIDは auto_increment を指定し、ユニークな値にしたほうがいいです。 偶然にも同じ時間に投稿されると、不具合が起こることが容易に想像できます。 その上で親記事か、回答か、返信かを分けるフィールドを用意したほうがいいでしょう。 記事ごとにユニークな値があれば削除や修正もやりやすいですし。

sadacha
質問者

お礼

moon_night様 こんにちは。お世話になっております。 #1のがる様へのお礼でも記載しましたが、idに重複を避けるため連番として登録するよう設定しております。 手持ちの書籍などを見ながらヒントになるものはないか?と色々と調べてはいるものの、見つけ出す事が出来ずにおります。 >その上で親記事か、回答か、返信かを分けるフィールドを用意したほうがいいでしょう。 >記事ごとにユニークな値があれば削除や修正もやりやすいですし。 なるほど、その通りかもしれませんね。初心者なりに色んな角度から考えてはいましたが、気付かないところも多々あるようです。 引き続きアドバイスなどしていただけたら幸いです。有難う御座いました。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 色々と想像はつくのですが…もしよろしければ、テーブルレイアウトを見せていただいてもよろしいですか? 差し支えなければ、create table文を直接貼り付けていただいても全然OKですので。

sadacha
質問者

お礼

がる様 こんにちは。お世話になっております。 テーブル内容は以下の通りです。^^; お恥ずかしいのですが、アドバイス頂けたら幸いです。 table:member_bbs +-----------------+--------------+------+-----+---------+----------------+ | Field    | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+---------+----------------+ | id       | int(11)    |     | MUL | NULL | auto_increment | | date      | varchar(12)  | YES  |  | NULL |  | | keyrandam   | varchar(16)  | YES  |  | NULL | | | subject     | text     | YES  |  | NULL | | | naiyou     | text     | YES  |  | NULL | | | to_id      | varchar(30)  | YES  |  | NULL | | | to_read     | varchar(4) | YES  |  | NULL | | | from_id     | varchar(30) | YES |  | NULL | | | from_name    | varchar(30) | YES  |  | NULL | | | from_todoufuken| varchar(20) | YES  |  | NULL | | | from_mail    | varchar(40) | YES  |  | NULL | | | from_tel     | varchar(20) | YES |  | NULL | | | from_fax     | varchar(20) | YES  |  | NULL | | +-----------------+--------------+------+-----+---------+----------------+ keyrandam というフィールドに、UNIXタイムスタンプにランダムな文字列を組み合わせたものを登録しております。 to_id が宛先、from_id が送信者としているわけですが、思うようなスクリプトを記述できなくて・・・ 引き続きアドバイスなど頂けたら幸いです。宜しくお願い致します。 追伸:見難くてすみません。

関連するQ&A