月刊誌の過去記事の目録を構築していて、プルダウンに発行年月と号数、特集スポーツ名を列記したショートカットメニューを構築したいのですが、月によって特集テーマが2つ、3つある号があり、これらもプルダウンに連記してセットしたいと思います。
以下のサンプルのように既に実現はできてはいるのですが、以下のコード、素人の私がみてもいかにも冗長であることは明白です。もっとスマートに書き換えられるならご教示いただければ幸いです。
なお、本件、別カテゴリでの質問での御礼に聞きかけた質問ですが(http://okwave.jp/qa/q8309533.html)、既に初期の目的が達せられたため締め切りました。恐縮ですが改めて伺います。
//元データ
CREATETABLE`mymagazine`(`myCode`int(5)unsignedNOTNULLauto_incrementCOMMENT'管理コード',`myPubYear`int(4)defaultNULLCOMMENT'発行年',`myPubMonth`int(2)defaultNULLCOMMENT'発行月',`mySequence`int(3)defaultNULLCOMMENT'号',`mySortNo`int(2)defaultNULLCOMMENT'巻毎のソート番号',`myCategoryCode`int(2)defaultNULLCOMMENT'分類コード',`myTheme`varchar(900)defaultNULLCOMMENT'テーマ',PRIMARYKEY(`myCode`)
)ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='テーブル'AUTO_INCREMENT=1;
INSERTINTO`mymagazine`(`myPubYear`,`myPubMonth`,`mySequence`,`mySortNo`,`myCategoryCode`,`myTheme`)VALUES(2005,7,138,1,99,''),(2005,7,138,2,1,'サッカー'),(2005,7,138,3,1,'サッカー'),(2005,7,138,14,16,''),(2005,7,138,15,15,''),(2005,8,139,4,1,'野球'),(2005,8,139,5,1,'野球'),(2005,8,139,17,17,''),(2005,8,139,18,17,''),(2005,9,140,1,99,''),(2005,9,140,2,1,'テニス'),(2005,9,140,3,1,'バスケ'),(2005,9,140,4,1,'バスケ'),(2005,9,140,5,1,'バスケ'),(2005,9,140,6,1,'水泳'),(2005,9,140,7,2,''),(2005,9,140,8,14,''),(2005,9,140,9,13,''),(2005,11,142,2,1,'柔道'),(2005,11,142,3,1,'剣道'),(2005,11,142,4,1,'剣道'),(2005,11,142,5,8,''),(2005,11,142,6,2,''),(2006,1,144,2,1,'卓球'),(2006,1,144,3,1,'卓球'),(2006,1,144,4,1,'バレー'),(2007,9,236,2,1,'陸上'),(2007,9,236,3,1,'陸上'),(2007,9,236,4,1,'陸上'),(2007,9,236,5,4,'ソフト'),(2007,9,236,6,5,'')
//コード
<?php
$con = mysql_connect(serv, user, pw);
$selectdb = mysql_select_db(DBNAME, $con);
$sql = "select *,";
$sql .= " (select if(max(mySortNo)=t1.mySortNo,1,null) from mymagazine where mySequence=t1.mySequence and myCategoryCode =1) as myflg"; // フラグ
$sql .= " from mymagazine as t1";
$sql .= " order by mySequence desc";
$rst = mysql_query($sql, $con);
$body = "<select name=\"myselect\"\">\n";
while ($col = mysql_fetch_array($rst)) {
// 発行年を見出しにセット
if ( $sv_myPubYear != $col["myPubYear"] ) {
if ( $sv_myPubYear != '' ) {
$body .= "</optgroup>\n";
}
$body .= "<optgroup label=\"" . $col["myPubYear"] . "年\">\n";
}
//号数(mySequence)と分類コード(myCategoryCode=特集、連載、投稿など各コーナー名で1だけを抽出する)
//が変わらないのに特集テーマが変わったらテーマの文言を追記する
if (($col["mySequence"] == $sv_mySequence) && ($col["myCategoryCode"] == $sv_myCategoryCode) && ( $col["myTheme"] != $sv_myTheme)) {
$selectStr = $selectStr . "◆" . $col["myTheme"];
} else {
$selectStr = $col["myTheme"];
}
//同じ号数で、直前のループと比較して文字数が減っていたら、前の方を採用
if (($col["mySequence"] == $sv_mySequence) && (mb_strlen($selectStr,"utf-8") < mb_strlen($sv_selectStr,"utf-8"))) {
$selectStr = $sv_selectStr;
}
//SQLで設置したフラグがたっている場合だけ、プルダウンメニューとして書き出す。
if ($col["myflg"] == '1') {
$body .= "<option>" . $col["myPubMonth"] . "月号(第" . $col["mySequence"] . "号) " . $selectStr . "</option>\n";
}
//次のループで比較検討用に各値の持ち越し
$sv_myPubYear = $col["myPubYear"];
$sv_mySequence = $col["mySequence"];
$sv_myCategoryCode = $col["myCategoryCode"];
$sv_myTheme = $col["myTheme"];
$sv_selectStr = $selectStr;
}
$body .= "</optgroup>\n";
$body .= "</select>\n";
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body>
<?= $body ?>
</body>
</html>
なお先日、別質問でMySQL関数の非推奨を教わり、こちらには後日に取り組むつもりです(なかなか対応できなくてスミマセン)
http://okwave.jp/qa/q8277847.html
お礼
yambejpさん、毎度お世話になりますm(_ _)m 考え方、非常に参考になります。大方針が拙いから、こんなぐちゃぐちゃになって しまうのでしょうね・・・ Classというのは、書籍などでちらっとは承知しているのですが、 敷居が高そうで勉強に踏み込めずにいます。 ステップアップには不可欠なのかもしれませんが。 少し出力方法、関数化などについて検討してみます。