UNIONの落とし穴

UNIONを利用してselectの結果を結合する場合、カラム名はUNION文の一番最初に書かれたSQL文のものが優先される。

その後のSQLの取得結果は、カラム名を見て同じものを同じ列に並べてくれるわけではなく、取得項目の順番のみで判別され、結合される。

例えば、1つめのselect結果が、
col1, col2, col3, col4
という順番で取得され、2つめのselect結果が
col1, col3, col2, col4
という順番で取得されていた場合、2つめのselect結果のcol3は、col2として、col2はcol3としてUNIONの取得結果が表示される。

項目名とは意味の異なるデータが表示されるので、まったく使えないデータとなる。

自分でSQL文を直接書いている場合には考えられない現象だが、フレームワークを用いてSQL文を生成している場合は、この落とし穴にはまりやすい。

その場合は、多少性能が落ちるかもしれないが、各取得結果をテーブルとみなしたサブクエリを用いて、取得項目の並びを指定して取得しなおすという方法が有効でした。

Mysqlのサブクエリとgroup、orderの優先度

Mysqlを使ってシステムを組んでいると、いろんな条件でデータを取得したい場面がでてくる。その中で、使用頻度が高いのがgroup by、order by、サブクエリの組み合わせ。

group byをすると、指定したキーで一番最初に現れたものが残り、後から現れたものは削除される。order by と併用した場合は、group by した結果に対して、order byが適用される。

order by を適用した後に、group by を適用したい場合は、サブクエリを用いてorder by を実行するSQLをテーブルとみなして、group by をかけるという方法になる。

例えば、mixiのようなSNSで各ユーザの最新の日記を取得したい場合は、日記テーブルを作成日で、降順にソートするSQLをテーブルとみなして、ユーザIDでgroup by をかけるというサブクエリを利用すれば可能。

group by と order by だと group by が優先されるというのは、結構覚えておくと役にたつことが多かったです。

MYSQLのUNIONとUNION ALLの違い

今やっているプログラムで使わざるを得なくなったUNION構文。
UNIONとUNION ALL何が違うんだろう?と調べてみました。

SQLをわかっている方向けに説明すると、行全体にdistinctをかけるのがUNIONで、かけないのがUNION ALL。

つまりUNIONで連結した場合、全てのカラムの値が同じ行が複数あった場合、1行を残してすべてまとめられます。

----------------------
| col_a | col_b |
----------------------
|  0  |  a  |
----------------------

こんな取得結果をUNIONとUNION ALLにて連結した場合。

----------------------
| col_a | col_b |
----------------------
|  0  |  a  |
----------------------

これがUNION

----------------------
| col_a | col_b |
----------------------
|  0  |  a  |
----------------------
|  0  |  a  |
----------------------

これがUNION ALL

nslookupコマンドで指定したレコードを調べる

今まで、

% nslookup co-hey.com

という内容で、Aレコードの内容しか調べたことなかったですが、

% nslookup [Enter]

> set type=MX [Enter]
> co-hey.com [Enter]

このようにすれば、レコード種別を指定して調べることができるそうです。
これは、使えるってことでメモ!

こちらの記事で知りました。
http://perltips.twinkle.cc/linux/nslookup_mx.php

中目黒 魚哲

最近、中目黒にある魚哲っていう魚料理がメインの居酒屋にいったんですが、
これが予想以上のあたりなお店でした。
http://r.tabelog.com/tokyo/A1317/A131701/13108115/

僕、実家が鮮魚店だったので、小さい頃から毎日魚料理が並んでて、よく食べてたんで、
なんとなく新鮮とか古いとか舌触りでわかると思ってるんですが(多分ね)、
ここのは新鮮、おいしい、変な臭みとか全然ない。

価格も安くないかもと思いつつ、一皿の量が多いので、結果的にお安い!

あと、緑茶ハイがお茶の風味満点で、ちょっと違うなって思わせてくれます。

中目黒で、飲むときあったら候補にいれてみてください。

CDJ850が発表されました

http://pioneer.jp/cdj/products/cdjplayer/cdj850.html

現在のCDJ800MK2の後継機がでてきました。
すでに発表されていたCDJ900が後継機だと思っていたので意外です。

900との違いは、Pro Link機能(CDJ同士をLANケーブルでつないで、1つのフラッシュメモリ、外付けHDDを共有する機能)がないこと。あとは、ディスプレイの違いが目立つところですね。個人的には、2000程のディスプレイがいらないなら、850、いるなら2000だと思います。900を買う理由というのは特段見つけれられないというのが感想です。SLIP MODEは正直まだピンときてません。

900にはジャンルとかからも選べるような表示がされていましたが、850はどうなんでしょうね。それっぽい画面の写真がないので、実物を近いうちに見に行ってきます。

2000には、MP3のアートワークを表示できるディスプレイの大きさ、ニードルタッチなど魅力的です。

CDJ2000にするか、持っているPCにTractor Scratch ProなどのDJソフトを入れて、850、400、350あたりで操作するか。このどちらかが実現できたらいいなと考えています。個人的なベストは2000だと思っています。予想ですが。

Tractorのバイナルコントローラーも時々不安定になると使っている方から聞いたので、まだ不安。安定しているものはやっぱり高いんだなと実感しています。

各CDJの詳細はこちらで。
http://pioneer.jp/cdj/products/cdjplayer/index.html

ここに動画もありました。

連想配列の同じkey名の値を加算する

前に覚えた func_get_args というメソッドを使える機会があったので、使った内容をメモ。

タイトルの通り、パラメタで渡された連想配列のうち、同じkey名の値を加算します。パラメタはいくつでも渡せます。 func_get_argsのいいところ。

    //-----------------------------------------------------------------
    // パラメタで渡された配列の、同じkey名の値を合算した配列を返却する
    //-----------------------------------------------------------------
    protected function _arrayAdd()
    {
        $ret = array();

        // パラメタが1つ以上ない場合は処理をしない
        $params = func_get_args();
        if (count($params) == 0 ) { return; }

        foreach ($params as $item) {
            if (!is_array($item)) { continue; }

            foreach ($item as $key => $value) { $ret[$key] += $value; }
        }

        return $ret;
    }

焼肉 大統領 中目黒

中目黒で一番安くてうまいという看板につられて、焼肉 大統領に入ってみました。

場所はこのあたり。中目黒駅を出て、目黒川に歩いていく道沿いにできている新しいビルの地下1階にあります。


大きな地図で見る

お店のリンクは本店のものですが、価格帯を見たところ中目黒店はもっと安い価格帯のものもあります。通常のロースは350円とかでした。ドリンクやサイドメニューはそんなに安くなかったので、ここら辺でバランスをとっているのかもしれません。

お肉も安いですが、期待はずれってことはなく、この値段でこの味はいいなと思われる内容でした。サイドメニューのチーズチヂミと、シメに食べたビビン麺(激辛)もおすすめです。

extractという関数を見つけた

wordpressのソースを見ていたら、extractという関数を見つけた。
詳細はこちら。http://php.net/manual/ja/function.extract.php

連想配列の、key名の変数に、vlaueの値をつっこんでくれる関数。
今まで、

list($key1, $key2, $key3) = explode($list);

のように書いてた部分が、

extract($list); 

というようにもかける。

listだと、変数の数を動的に増やしたいときに不便だと感じるときがあったので、そういうときの代替案として使えそう。

color me shopにページャーをつける

color me shopをいじる機会があったので、今回作ったページャーをご紹介。
テンプレートは、smartyなので馴染みがあり、やりやすかったです。

目指す表示はこんな感じ
<< 前のページへ 1 ・・ 4 5 6 ・・・ 10 次のページへ >>

   
<{* 現在表示中のページ数をcurrent_pageに設定 *}> <{ if $smarty.get.page == "" }><{ assign var="current_page" value="1" }><{else}><{ assign var="current_page" value=$smarty.get.page }><{/if}> <{* 前のページがある場合は、リンク化する *}> <{if $productlist_prev_page != ""}><< 前のページへ<{else}> << 前のページへ <{/if}> <{* ページ表示数で商品数を割り、ページ数を算出 *}> <{math equation="ceil($productlist_num/12)" assign="max_page"}> <{math equation="$current_page-1" assign="bef_page" }> <{math equation="$current_page+1" assign="aft_page" }> <{ assign var="page_flg" value="0" }> <{section name=pager loop=$max_page }> <{* 表示中のページに、専用のclassを付与する *}> <{ if $smarty.section.pager.iteration == $current_page }> <{$smarty.section.pager.iteration }> <{ else }> <{ if $productlist_sort_now == "p" }> <{ assign var="page_url" value=$productlist_sort_price|cat:"&page="|cat:$smarty.section.pager.iteration }> <{ elseif $productlist_sort_now == "n" }> <{ assign var="page_url" value=$productlist_sort_new|cat:"&page="|cat:$smarty.section.pager.iteration }> <{ else }> <{ assign var="page_url" value=$productlist_sort_def|cat:"&page="|cat:$smarty.section.pager.iteration }> <{ /if }> <{ if $max_page > 7 }> <{* 1ページ目と最終ページ、現在表示しているページの前後1ページをリンクとして表示 *}> <{ if in_array($smarty.section.pager.iteration, array(1,$bef_page, $aft_page, $max_page)) }> <{ assign var="page_flg" value="0" }> <{ $smarty.section.pager.iteration }> <{ elseif $page_flg == "0" }> <{ assign var="page_flg" value="1" }> ・・・ <{ /if }> <{ else }> <{ $smarty.section.pager.iteration }> <{ /if }> <{ /if }> <{/section}> <{* 次のページがある場合は、リンク化する *}> <{if $productlist_next_page != ""}>次のページへ >><{else}> 次のページへ >> <{/if}>