Mysqlとphpでソートや更新時の効率的な処理
カラムの作成日時と更新日時のそれぞれでソート、
作成日時当日はNEWの文字を入れる。というものを作りたいと思っています。
<?php
$cer = "SELECT * FROM data_data WHERE 1";
function orderbyset($cul, $sc, &$cer){
$cer .= " ORDER BY ".$cul." ".$sc;
}
if(isset($_GET['orderby'])){
switch($_GET['orderby']){
case 'md_asc':
orderbyset('modified_date','ASC',$cer);
break;
case 'md_desc':
orderbyset('modified_date','DESC',$cer);
break;
case 'cd_asc':
orderbyset('create_data','ASC',$cer);
break;
case 'cd_desc':
orderbyset('create_data','DESC',$cer);
break;
}
}
$acc = mysql_connect(ホスト,ユーザー,パスワード);
$que = mysql_query($cer,$acc);
$html = "";
while($row = mysql_fetch_array($que)){
$id = $row["id"];
$name = $row["name"];
$modified_date = $row["modified_date"];
$create_data = $row["create_data"];
$daydiff = floor((strtotime($modified_date)-strtotime($create_data))/(3600*24));
if($daydiff==0){$datatext = 'new';}else{$datatext='';}
$html .= "<tr><td>$id</td><td>$name</td><td>$modified_date</td><td>$create_data</td><td>$datatext</td></tr>\n";
}
?>
<html lang="ja">
<head>
<title></title>
</head>
<body>
<p>更新日時順<br />
<a href="data-sort.php?orderby=md_asc">昇順</a>
<a href="data-sort.php?orderby=md_desc">降順</a>
</p>
<p>作成日時順<br />
<a href="data-sort.php?orderby=cd_asc">昇順</a>
<a href="data-sort.php?orderby=cd_desc">降順</a>
</p>
<table><?php echo $html; ?></table>
</body>
</html>
+---------------+-----------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-----------+------+-----+-------------------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| modified_date | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
| create_data | timestamp | YES | MUL | NULL | |
+---------------+-----------+------+-----+-------------------+-------+
modified_dateの属性にはon update CURRENT_TIMESTAMPを設定し、
カラムのデータを変えるとmodified_dateが更新され、create_dataはそのままです。
SELECT id,name,modified_date,create_data,IF(`create_data`>CURDATE() - INTERVAL 0 DAY,'NEW',DATE_FORMAT(`create_data`,'%Y/%m/%d')) AS `ddd` FROM `data_data`
http://okwave.jp/qa/q3058491.htmlでの方法がありました。
$daydiff = floor((strtotime($modified_date)-strtotime($create_data))/(3600*24));
if($daydiff==0){$datatext = 'new';}else{$datatext='';}
「あるカラムの情報が変わったら○○させる」といったことをいくつか追加していきたいので、
パフォーマンスが落ちることを少しでも避けるためにphpで処理するようにしましたが、一般的にはどちらを使うものなのでしょうか。
また、ifばかりにならないようにswitchを使ったのですが、ソートもいろいろ追加していきたく、そうなると今度はswitchが多くなってしまいます。
switchやifを使わずにスマートにやれる方法はないでしょうか。
お礼
回答ありがとうございました。 また、アドバイスありがとうございました。 >蛇足ですが、設計的にはトリッキーなSQLを書かないで済むようにやはり登録時には更新日時カラムにも登録日時カラムと同じ値を入れておくのが王道だと思います 王道自体がどういうのか知らなかったため、大変参考になりましたー