PHP で MySQL の2つの列のデータを入れ替える

Web サイトによくある新着ニュースやトピックスなどの並び順は、掲載日順になっていることが多いです。
でも、掲載日より優先して、重要そうな情報が一番上になっていたりします。
そうなってくると、データベースのテーブルには表示順フィールドが必要になってくるのかなと思います。

[adsense1]

CMSで新着ニュースを管理するとき、並べ替え欄の ▲ ▼ をクリックすることで並べ替えられるようにしてみます。
例えば、下図の赤枠部分をクリックすると、表示順4と表示順5が入れ替わり、表示順4が[アンケートのお願い]、表示順5が[プレゼントのお知らせ]になるようにします。

mysql-replace-row01

列の並べ替え処理

テーブル名:news
表示順フィールド名:num

//表示順4と表示順5の列を入れ替える
$num1 = 4;
$num2 = 5;

$sql = sprintf('UPDATE news SET num = CASE WHEN num = %d THEN %d WHEN num = %d THEN %d ELSE num END WHERE num IN (%d, %d)', 
    mysql_real_escape_string($num1), 
    mysql_real_escape_string($num2), 
    mysql_real_escape_string($num2), 
    mysql_real_escape_string($num1), 
    mysql_real_escape_string($num1), 
    mysql_real_escape_string($num2));
$rs = mysql_query($sql);

これで表示順4の列と表示順5の列のデータが入れ替わります。

新規登録時の処理

ちなみに、新規登録されたニュースの表示順は必ず 1 にするということでいいのかなと思います。

// まず全データの表示順に 1 を足す
$sql = 'UPDATE news SET num=num+1';
$rs = mysql_query($sql);

// それから新規入力データを表示順 1 として登録する
$sql = sprintf('INSERT INTO news SET num=1, start_date="%s", end_date="%s", title="%s", contents="%s", created=NOW()', 
    mysql_real_escape_string($startDate), 
    mysql_real_escape_string($endDate), 
    mysql_real_escape_string($title), 
    mysql_real_escape_string($contents));
$rs = mysql_query($sql);

わかりづらくてすみません。
もっと良い方法があるとは思います。

[adsense2]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください