ここ数日、実に調子がよろしくない。

誰が悪いって、自分しかいないのだが。

色々考えていると、どんどん負のスパイラルに陥っていく。

アニマル浜口よろしく“気合いだ~!!”で乗り切れたら、どれだけラクか。

とりあえず今日は、明日の自分に淡い期待を抱いておこう。

さて、最近ずっとMySQLばかりだが、今日も(php+)MySQLである。

phpのコードなど、プログラミングに縁のない人(数年前まで自分もそうだったが)からしたら、まるで竜でも呼び出せそうな呪文に見えるかもしれないが、残念ながらボクはまだその領域に達していない。

せいぜい、MySQLからデータを呼び出せる程度である。

早く幻獣を召喚できるようになりたいと願う。

今回は、“MySQLから、重複するデータを除外してデータを抽出する方法”について。

前回の記事(MySQL、楽しいわ。今日はLIMITとOFFSETについて。)にも書いたが、“ボウリングの紆余曲折”の“スコア閲覧”ページで、MySQLから日付データを抽出して出力している。

ボウリングのスコアを保存するMySQLのテーブルには、“date”カラムと“game”カラムがある。

例えば2月25日に6ゲームしたとすると、“date”カラムに“2012-02-25”という共通のデータが入り、“game”カラムに“1”~“6”というデータが入った行が6行生成されることになる。

このとき、“date”カラムから素直に“SELECT `date` FROM ~”で呼び出すと、“2012-02-25”が6連続で抽出されてしまう。

そこで、重複するデータを除外してデータを抽出するために、“DISTINCT”を使う。

具体的には、次の通り。

$sql = <<< SQL
SELECT DISTINCT `date`
FROM {$tblname}
ORDER BY `date` DESC
SQL;

抽出したいカラム名の前に“DISTINCT”を付け加えるだけ。

そう、たったコレだけ。

これを知る前は、重複しまくった日付を配列に格納して、php側で重複削除をしていた。

$sql = "SELECT `date` FROM {$tblname} ORDER BY `date` DESC";
$res = mysql_query($sql, $conn);

$dateArr = array();
while($row = mysql_fetch_array($res)){
  array_push($dateArr, $row['date']);
}
$dateArr = array_unique($dateArr); // 重複する値を削除
$nullArr = array();
$dateArr = array_merge($nullArr, $dateArr); // 空の配列と結合し、キーを0から振り直し

、、、アイディアっちゃあアイディアだが、たった1行で済む処理を、、、ねえ?バカでしょ?(笑)

いやあ、知れば知るほど、便利。

ただし、一つハマってしまったことがあるので書いておこう。

データの個数を調べる時には“SELECT COUNT(`date`)”というクエリ文を発行するのだが、この場合に重複削除(“DISTINCT”)を適用する場合は次のように記述する。

$sql = "SELECT COUNT(DISTINCT `date`) FROM {$tblname}";

最初、“DISTINCT”の付ける場所がわからなくて焦った。

ちなみにこの“DISTINCT”は、“基礎からのMySQL”には一切掲載されていなかった。

確かに“基礎から”丁寧に解説してくれているが、、、

逆さから表示:REVERSE関数

佐藤⇒藤佐、高橋⇒橋高

REVERSE関数を使うと、逆さ言葉が見つけられそうです。

こんなクダラナイ関数載せるぐらいなら“DISTINCT”を載せろっ