カテゴリー ‘ web & pc

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のサブクエリとgroup、orderの優先度 はコメントを受け付けていません。

MYSQLのUNIONとUNION ALLの違い

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

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

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

1
2
3
4
5
----------------------
| col_a | col_b |
----------------------
|  0  |  a  |
----------------------

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

1
2
3
4
5
----------------------
| col_a | col_b |
----------------------
|  0  |  a  |
----------------------

これがUNION

1
2
3
4
5
6
7
----------------------
| col_a | col_b |
----------------------
|  0  |  a  |
----------------------
|  0  |  a  |
----------------------

これがUNION ALL

  • MYSQLのUNIONとUNION ALLの違い はコメントを受け付けていません。

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

今まで、

1
% nslookup co-hey.com


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

1
2
3
4
% nslookup [Enter]
 
> set type=MX [Enter]
> co-hey.com [Enter]


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

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

  • nslookupコマンドで指定したレコードを調べる はコメントを受け付けていません。

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    //-----------------------------------------------------------------
    // パラメタで渡された配列の、同じ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;
    }

  • 連想配列の同じkey名の値を加算する はコメントを受け付けていません。

extractという関数を見つけた

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

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

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

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

1
extract($list);

というようにもかける。

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

  • extractという関数を見つけた はコメントを受け付けていません。

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
   <div class="pnavi">
   <{* 現在表示中のページ数を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 != ""}><a href="<{$productlist_prev_page}>" title="Page <{$current_page-1}>"><< 前のページへ</a><{else}>&nbsp;<< 前のページへ&nbsp;<{/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 }>
       <span class="here"><{$smarty.section.pager.iteration }></span>
   <{ 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" }>
         <a href="<{$page_url}>" title="Page <{$smarty.section.pager.iteration }>"><{ $smarty.section.pager.iteration }></a>
         <{ elseif $page_flg == "0" }>
           <{ assign var="page_flg" value="1" }>
           ・・・
         <{ /if }>
       <{ else }>
         <a href="<{$page_url}>" title="Page <{$smarty.section.pager.iteration }>"><{ $smarty.section.pager.iteration }></a>
       <{ /if }>
   <{ /if }>
   <{/section}>
 
   <{* 次のページがある場合は、リンク化する *}>
   <{if $productlist_next_page != ""}><a href="<{$productlist_next_page}>" title="Page <{$current_page+1}>">次のページへ >></a><{else}>&nbsp;次のページへ >>&nbsp;<{/if}>    
    </div>

  • color me shopにページャーをつける はコメントを受け付けていません。

外付けHDDとMacの相性

結論から先にいいます。
lacieとかMac用ってうたわれているもの以外の外付けHDDを使うときは、Macをスリープしない設定にした方が無難と思われます。

家では、バッファローの外付けHDDを2つ使っています。USBで本体から電源を取るものが1つ(timemachine用)、電源別のものを2つ(Macの機能を使ってRAIDにしてます)。このうち、timemachine用のものと、RAIDにしているものの1つが認識しなくなったり、RAIDエラーが起きるようになりました。

調べてみたところ、lacieとかはmacがスリープすると連動してスリープする機能が付いているみたいなんですが、バッファローとかはそこまでサポートしてないので、timemachineを設定してたりして、バックアップ中にスリープしたりすると、バックアップに失敗することがあるということでした。

この現象は何回か発生していて、リトライを何回かすると成功してたので、気にしてませんでした。このとき調べておけばよかったですね。失敗を繰り返すうちに、外付けHDDがダメになってしまったようです。

あと、電源を外からとっている方が安全だと感じました。壊れ方を見た印象なので、裏付けはないのですが。USBで電源もまかなうものは認識すらされなくなってしまったので。

スリープはしない設定にする。電源はmacから取らない。
これを今後はやっていくつもりです。

  • 外付けHDDとMacの相性 はコメントを受け付けていません。

iconを探すのに便利なサイト

http://www.iconfinder.com/

キーワード入れると、関係ありそうなiconが表示される。
デザイナーさんの中だと有名なサイトなのかな?
僕みたいにデザイン全くできない人にとってはありがたい。

http://www.iconfinder.com/search/2/?q=arrow

こんなのとか絶対使えると思う。

macbook proの外部ディスプレイ

僕が使っているmacbook proは、MB133J/Aという型番のやつです。
外部ディスプレイをつなげて、デュアルモニタでやってるんですが、このモニタがもともとwindowsのデスクトップ用に買ったものなので、解像度が1280×1024なんですよね。なんか、macbook proの画面とバランスが悪い。

macbook proの画面いっぱいに広げた、ウィンドウがもっていけなかったりとかね。使い勝手もイマイチ。
なので、購入を考えてたんですが、フルHDの解像度に対応しているのかがわからなかった。
16:10のアスペクト比に対応してて、1920x1200とかそれ以上のもいけるので、問題なさそうだけど、フルHDは16:10ではないので、そこがひっかかったら。。。買った後にわかるとか嫌だ。

ということで、アップルストアに確認したところ、「もちろんいけますよ!」とのこと。
おー、液晶テレビが流行る前に購入したやつでも対応してくれててよかったー!

これを検討中。画面もツヤツヤしてないやつだから、作業用にはよさそう。
http://www.amazon.co.jp/gp/product/B002TKKMA2/ref=ord_cart_shr?ie=UTF8&m=AN1VRQENFRJN5

  • macbook proの外部ディスプレイ はコメントを受け付けていません。

airtunesを使ってみた

自宅では、無線LANを利用するのに AirMac Expressを使ってます。
以前から、DJの先輩が、無線LANでiTunesの音楽をスピーカーに飛ばしてるってことを教えてもらっていたのですが、1Kの部屋ではなかなかメリットもなく、後手後手になってました。。で、今回やってみました!!

http://www.apple.com/jp/airmacexpress/features/airtunes.html
ここを見ながらやったんですが、AirMac Expressのステレオピンジャックを利用してアンプに接続し、iTunesの右下にあるメニューから、”AirMac Express”を選択すると、ステレオ経由で音が流れてきました。オーディオインタフェース経由でやってたんですが、これで有線接続しなくてもiTunesの音が楽しめます!

ここで、youtubeとか、radikoとかブラウザで音楽を楽しむことってありますよね。
iTunes以外でも、AirMac Express経由で音を出せないものなのか!?ということで調べたら、こんな記事が。
http://mylifelog.sunnyday.jp/wordpress/2010/03/21/647

この Airfoil っていうアプリを使うと、AirTunesをiTunes以外のアプリでも使えました。
とりあえず動作確認まで。有料アプリなので、もっとひろい部屋に引っ越したとき、購入しようと思います。
http://rogueamoeba.com/airfoil/mac/

他にもアプリを作成されてたので、これもメモ。
http://rogueamoeba.com/

  • airtunesを使ってみた はコメントを受け付けていません。

return top