おっしゃあ、投稿詳細表示ページ作るど~。
 今回の説明も最下部にあるサンプルソース:konohana.zipをベースに説明。

 前回の投稿ページ(mainlist.php)から呼び出される投稿詳細表示ページ(suggestlist.php)は以下のようになるわけですわ。

$テン・シー・シー-2

 まずは写真と問い合わせコメントね。
 こいつは投稿ページ(mainlist.php)のPOSTで渡される

<input name="contribution_id" type=">hidden" value="{$id}" />

 を$_POST["contribution_id"]で受け取り変数$idに入れて

"SELECT comment, url FROM contribution, image WHERE contribution.id=$id and image=image.id"

 で取り出せる。
 その次に続く提案された名称のリストは提案テーブル(suggestion)

$テン・シー・シー-2

 から

"SELECT id, name, comment FROM suggestion WHERE cont_id=$id"

 で提案ID、提案名、コメントを取り出して~...
 まてまて、指示数の多いのを第一候補に、その後も指示数順に並べないと駄目なんだよな。
 となれば、各提案ごとに投票テーブル(vote)

$テン・シー・シー-3

 から提案IDと一致するsug_idを持つレコードを取り出して

"SELECT id FROM vote WHERE sug_id=$sug_id"

 こいつのレコード数を

mysql_num_rows

 で計算して、この数の多い提案から表示、となると提案名と指示数の配列作って...、と、バカか...

 「バカかおめェ…」餓狼伝Vol.96で相手のフック攻撃にわざと顎を突き出すグレート巽の姿に、丹波文七が素の突っ込みをいれるがごとく...

 と心の声が響き渡ったんすよ。
 そうなのだ...
 「iPhoneアプリ開発、その(77)」であんだけavg()関数group byをやったのに、ぜんぜん使えてね~じゃね~の。
 うぉおおおお、これか?これが宝の持ち腐れっていうやつか?
 ほんとに腐ってる...

 そうなのだよ。
 suggestion, voteを元にgroup by使って提案IDごとにcount()関数で計算させることができるんだよ。
 なんでこれで計算できるかは、その(77)を読みましょう。

"SELECT suggestion.id, name, suggestion.comment, count(vote.id) FROM suggestion, vote WHERE cont_id=$id and suggestion.id=sug_id group by suggestion.id"

 でもって、そのカウント結果をorder by descで大きい順にソートさせるためのSQL文

"order by count(vote.id) desc"

 を追加してやれば、やらなきゃいかん事がすべて完了した表が得られるんだよ。
 ちなみにカウント値項目の指定ですが

$vote_count = $one_record["count(vote.id)"];

 でちゃんと値がとれました。すげえ。

 もちろん以下のように、最初にやったcomment, urlも合わせて取り出す事にして、SELECT文を一つにすることもできる。

"SELECT contribution.comment, url, suggestion.id, name, suggestion.comment, count(vote.id) FROM contribution, image, suggestion, vote WHERE cont_id=$id and suggestion.id=sug_id group by suggestion.id order by count(vote.id) desc"

 ただ、これはこうやって一回でSELECTをすますのと、2回に分けるのと、どっちがパフォーマンスがいいのかな~、謎。

 あとは投票ボタン、詳細表示ボタン、新規提案ボタンの<FORM>の用意をすればOK。
 まずは新規提案ボタンから

$テン・シー・シー-4

 こいつは、押されたら自分自身のページを

<input name="suggest" type="submit" value="提案する" />

 というPOSTで呼び出す。この対応が
if ($_REQUEST["suggest"] != "") {
$name = htmlspecialchars($_POST["name"]);
$comment = htmlspecialchars($_POST["comment"]);

 という部分で一緒にPOSTされた"name"、"comment"を、それぞれ$name$commentに取り出し
"INSERT INTO suggestion (cont_id, name, comment) VALUES('$id','$name','$comment')"

 というSQL文でデータベースに登録している。
 ただし、これだけだと、この提案IDをもつ投票(vote)テーブルのレコードがひとつも存在しないので、上のgroup byでひっかからなくなる。
 ということは永遠に表示されない事になるんで、自分が提案した名前に1票、自作自演で投票もするようにしました。

$sug_id = mysql_insert_id();
mysql_query("INSERT INTO vote (sug_id) VALUES('$sug_id')", $sqlserver);

 これでばっちりリストされる。

 投票ボタン

$テン・シー・シー-5

 こいつも押されたら自分自身のページを

<input name="vote" type="submit" value="支持する" />

 というPOSTで呼び出す。この対応が

if ($_REQUEST["vote"] != "") { 
$sug_id = $_POST["suggestion_id"];

 という部分でPOSTされた"suggestion_id"を$sug_idに取り出し

"INSERT INTO vote (sug_id) VALUES('$sug_id')"

 でvoteテーブルに登録している。
 このため、

<input name = "suggestion_id" type="hidden" value={$sug_id} />

 で提案IDも送っている。
 また、どちらのボタンも投稿IDは必須なので

<input name = "contribution_id" type="hidden" value={$id} />

 も加えている。

 最後は詳細ボタン

$テン・シー・シー-6

 こいつは、自分自身のページじゃなく、以下のような提案詳細ページ(suggest.php)を呼び出すようにしている。

$テン・シー・シー-3

 このページはsuggestlist.phpの応用。特に説明はしない。唯一、投票テーブル(vote)のコメントは投稿詳細表示ページで投票ボタンを押された場合は空になっている。そのため空コメントをはじくという意味でand vote.comment != ''を加えてます。

"SELECT vote.comment FROM vote WHERE sug_id=$sug_id and vote.comment != ''"


 ちなみに、この時の結果は

  one_recored['vote.comment'];

 じゃなく

  one_recored['comment'];

 としないと取り出せませんでした。別にテーブルを指定する必要がない場合に限り、テーブル名を付けると取り出せないみたいです。

 あと、前回のmainlist.phpも若干修正。今回のgroup byを使い投票数の多い提案名を表示するようにしますた。そのためのSQL文はこれ

"SELECT name FROM suggestion, vote WHERE cont_id=$id and suggestion.id=sug_id group by suggestion.id order by count(vote.id) desc"


 今回のサンプルの使い方は以下のとおり

 1、投稿
テン・シー・シー-1

 2、提案
テン・シー・シー-2

 3、投票
テン・シー・シー-3

 4、コメント付きで投票したい場合
テン・シー・シー-4

 みんなも、こいつで2、3件投稿して、提案、投票を繰り返した後、ターミナルからSELECT文を使って、どういう命令でどういう表を抽出できるか、いろいろ試してみてみて~!

http://localhost/mainlist.php

------------
サンプルソース:konohana.zip

 3つのファイルともWebのルートフォルダ(Macintosh HD→ライブラリ→WebServer→Documents)に置いてください。わからん人は「iPhoneアプリ開発、その(136)」を参照。
 MySQLとkonohana_testデータベース必須。