MW211 EXIT

devlog
SQL/内訳数
2012年06月30日
┌──────────────────────────────────────┐
│a                                                                           │
│└b                                                                         │
│  └c                                                                       │
└──────────────────────────────────────┘
上記のような階層になっていて、a毎の内訳数をそれぞれで得たいとき。

以下のようにやってはダメ。
┌──────────────────────────────────────┐
│SELECT a.id,                                                                │
│       COUNT(b.*) AS count_b,                                               │
│       COUNT(c.*) AS count_c                                                │
│    FROM a                                                                  │
│        LEFT JOIN b ON b.a_id = a.id                                        │
│        LEFT JOIN c ON c.a_id = a.id                                        │
│    GROUP BY a.id                                                           │
└──────────────────────────────────────┘
「count_b」も「count_c」もおっきな数になる(a×b×cの組み合わせ総数になる)。

以下のようにすればよい。
┌──────────────────────────────────────┐
│SELECT a.id,                                                                │
│       COUNT(DISTINCT b.*) AS count_b,                                      │
│       COUNT(DISTINCT c.*) AS count_c                                       │
│    FROM a                                                                  │
│        LEFT JOIN b ON b.a_id = a.id                                        │
│        LEFT JOIN c ON c.a_id = a.id                                        │
│    GROUP BY a.id                                                           │
└──────────────────────────────────────┘
分類:SQL
PostgreSQL/書式の罠
2012年06月29日
数値を文字列に変更するには、以下のように「TO_CHAR()」を使う。
┌──────────────────────────────────────┐
│TO_CHAR(列, '0') AS 新名                                                    │
└──────────────────────────────────────┘
でもこうすると、「 1」みたいに先頭にスペースが付加されてしまう

これを回避するには
┌──────────────────────────────────────┐
│TO_CHAR(列, 'FM0') AS 列                                                    │
└──────────────────────────────────────┘
って「FM」をつけてあげればよい。
「1」になる。
分類:PostgreSQL
【未解決】formのenctypeの弊害
2012年06月28日
<form enctype="multipart/form-data">
って、アップロードとかの時に必要だけど
これって弊害はないのかな?
なければ常時記述しておけばいいと思うのだけど
記述量が多いっていう弊害以外になんかあるのだろうか?
分類:PHP、【未解決】
PHP/【未解決】配列の列の横断的抽出
2012年06月27日
┌──────────────────────────────────────┐
│$array = array(                                                             │
│  1 => array('id' => 1, 'code' => 'a'),                                     │
│  2 => array('id' => 2, 'code' => 'b'),                                     │
│  3 => array('id' => 3, 'code' => 'c')                                      │
│);                                                                          │
└──────────────────────────────────────┘
例えば上記のような二次元配列があって、code列だけを抽出したい場合に、
簡単に実現できる方法はないものだろうか

以下のような力技が思いつくがもっとスマートにできないものか
┌──────────────────────────────────────┐
│function array_keys2($array, $key) {                                        │
│  $return = array();                                                        │
│  foreach ($array as $value1) {                                             │
│    foreach ($value1 as $key2 => $value2) {                                 │
│      if ($key2 === $key){                                                  │
│        $return[] = $value2;                                                │
│      }                                                                     │
│    }                                                                       │
│  }                                                                         │
│  return $return;                                                           │
│}                                                                           │
└──────────────────────────────────────┘
分類:PHP配列、【未解決】
SQL/【未解決】集合関数の組み合わせ
2012年06月26日
集約関数を複合させて使う場合
┌──────────────────────────────────────┐
│SELECT SUM(列1),                                                            │
│       MAX(列2)                                                             │
│    FROM 表;                                                                │
└──────────────────────────────────────┘
みたいに、合計値と最大値を同時に求めることはできる。

┌──────────────────────────────────────┐
│SELECT SUM(列1),                                                            │
│       MAX(列2),                                                            │
│       列3                                                                  │
│    FROM 表;                                                                │
└──────────────────────────────────────┘
みたいに、最大値をもつ列の別項目を取得するのはできるのだろうか?
分類:SQL、【未解決】
PostgreSQL/四捨五入の罠
2012年06月24日
「7÷4=1.75」なわけだが、(小数点以下を)四捨五入した場合「2」になるはずだ。
┌──────────────────────────────────────┐
│SELECT ROUND(7 / 4)  →  1                                                  │
└──────────────────────────────────────┘
でも、そうならない。。。

どうやら、浮動小数点とかが絡むと正確性がなくなるらしい(ありがちな話)。

numeric型を使えばよいみたい。
いろいろ試してみた。
┌──────────────────────────────────────┐
│SELECT ROUND(7                   / 4)  →  1(double precision型)  不正確    │
│SELECT ROUND(7::bigint           / 4)  →  1(double precision型)  不正確    │
│SELECT ROUND(7::integer          / 4)  →  1(double precision型)  不正確    │
│SELECT ROUND(7::double precision / 4)  →  2(double precision型)  不正確?  │
│SELECT ROUND(7::real             / 4)  →  2(double precision型)  不正確?  │
├──────────────────────────────────────┤
│SELECT ROUND(7::numeric          / 4)  →  2(numeric型)             正確    │
│SELECT ROUND(7::decimal          / 4)  →  2(numeric型)             正確    │
└──────────────────────────────────────┘
分類:PostgreSQL
jQuery/カプセル化
2012年06月23日
┌──────────────────────────────────────┐
│$(function() {                                                              │
│  処理                                                                      │
│});                                                                         │
└──────────────────────────────────────┘
jQueryの処理はたいてい以下の部分に書く。
なんでここに書くかは割愛するが(初期処理で起動してくれるみたいな感じか)、
最近以下のようなソースを見かけた。
┌──────────────────────────────────────┐
│(function($){                                                               │
│$(function() {                                                              │
│  処理                                                                      │
│});                                                                         │
│})(jQuery);                                                                 │
└──────────────────────────────────────┘
なんか、コメントには「カプセル化」とか書いてあった。

これは「$」を他に使っている環境下でjQueryを使う場合に
jQueryを保護してくれるカプセルのようなものらしい。
┌──────────────────────────────────────┐
│(function($){                                                               │
│  カプセル化するもの                                                        │
│})(jQuery);                                                                 │
└──────────────────────────────────────┘
「prototype.js」とか独自の定義とかそういうのが万が一あっても
影響を受けないようにするためとのこと。

汎用的なソースを提供しているのであれば、念のため備えておいた方がいいだろう。
ま、そこまでのご身分ではないので、しばらく無縁のようだ。(でいいの?)
分類:jQuery
jQuery/selectタグの変更
2012年06月22日
selectタグを変更するには以下の通り。
┌──────────────────────────────────────┐
│$('select').val(3);                                                         │
└──────────────────────────────────────┘
値(value)を指定してあげれば、それが選択された表示となる。
上記は「value」が「3」を選んだ場合。
選択肢の表示が「長嶋」になるはずだ。(うそ)
分類:jQuery
PHP/jQueryの$.get()とかを移植しようとしたが…
2012年06月21日
jQueryにおいて「$.get(URL,…);」などを使って、
別CGIからデータを取得したりする場合がある。

これをPHPにそのまま移植しようとして、
「file_get_contents()」を使ってみたのだがハマった。
(っていうかいまだに抜け出していない)

(1) 相対パスのURLが使えない
  jQueryでは相対パスもOKだったが、「file_get_contents()」の場合
  「http://」から書かないとエラーとなるみたい。

(2) 絶対パスで書くとセッション情報が共有できない
  「http://」から書いたら書いたで、あっち側の世界とこっち側の世界は
  別ものとなってしまうらしく、こっちでもっているセッション情報を
  相手に引き継げない

なんかいい方法はないものか。。。

今のところは、PHPに移植せず、PHP完了後、jQueryの初期処理で実行させて
PHPで最初にやってるっぽくすることしか方法はないのかも。
分類:PHP
PHP/タイムスタンプ型の値を1ヶ月後にする方法
2012年06月19日
まずは、「YYYY-MM-DD HH:II:SS +1 month」をstrtotime()で変換するために
文字列を編集する方法。
┌──────────────────────────────────────┐
│$timestamp = strtotime(date('Y-m-d H:i:s', $timestamp) . ' +1 month');      │
└──────────────────────────────────────┘
なんかまわりぐといような。。。

続いて、現在から1ヶ月後のタイムスタンプから現在のタイムスタンプを差し引いて
1ヶ月分のタイプスタンプを求め加える方法。
┌──────────────────────────────────────┐
│$timestamp += (strtotime('+1 month') - time());                             │
└──────────────────────────────────────┘
1ヶ月分のタイプスタンプがダイレクトに取得できればいいのだが。。。

★これはダメなことが後日判明しました
  詳しくは【訂正】で
分類:PHP
前へ 1 2 3 次へ