March 9, 2010
MySQL chara issue
■結局どう設定する?
作成時:CREATE DATABASE aaa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8_general_ci;
アプリ:SET NAMES utf8mb4; あるいは mysql_set_charset('utf8mb4');
↑
DB作成時とアプリ使用時でutf8かutf8mb4で最低限統一する
utf8mb4とは文字コードの一種で、UTF8で4バイト文字を扱う事が出来るもの
絵文字や中国漢字、日本語でも特殊漢字などは4バイトが含まれている
MySQLでは5.5からこのutf8mb4に対応している
utfmb3は3バイト、MySQLは3バイトは非推奨
照合順序 は utf8_general_ci >新バージョンで変わっているので要確認
_ci はcase insensitive、_cs は case sensitive、_bin はバイナリ
_ci がパフォーマンスがいい、
SET NAMES より mysql_set_charsetがverによってはいい、またPDOが推奨されているが
https://techracho.bpsinc.jp/baba/2010_02_17/1133
https://www.php.net/manual/ja/function.mysql-set-charset.php
絵文字で上手くいかないと行が途切れる等があるらしい、utf8が良い?
作成時:CREATE DATABASE aaa DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
アプリ:SET NAMES utf8; あるいは mysql_set_charset('utf8');
-----------------------------------------
■DBのバックアップ(MySQLのダンプ)
バージョンでコマンドが違う場合がある、古いやつの場合↓
DB設定の文字コード、DBの運用文字コード、サーバOSの文字コード、SQLクライアントの文字コードの間で自動変換が掛かり面倒
http://kgbu.hateblo.jp/entry/20081226/1230259302
バイナリでダンプし、バイナリでインポートすると問題はない
しかしバイナリのバイトシーケンスが付与されるので気持ち悪い
Blobのような特殊なカラムがなく文字コードが統一されていればそれでやりたい(utf8)
https://ngyuki.hatenablog.com/entry/2018/06/21/220624
cp932: MS win/IBM/NEC98のSJIS、各社独自に拡張している、ほぼWin用
mysqldump -Q --host=192.168.1.2 --user=oreore --password=**** --default-character-set=binary name_db >$DBDUMP_FILE
-Qはquickオプション、通常はダンプ時に一気にテーブルデータをメモリへバッファしますがq指定で1行ごとに処理し大きなテーブルに有用
オプションはハイフン2つはフル表記で=で値を付与、ハイフン一つで短縮形でスペースを付けた上で値を付与
--host=host_name -h host_name
???mysqldump-4.0が通らない、mysqldumpバイナリ/utf8オプションも使えない
Putty(SSH)等で入り sh db_backup.sh で実行しエラーを見る、無変換だと出せるが文字コードが混合している
ps -aux あるいは ps aux でプロセスを見て、駄目なら殺す kill [pid]
phpmyadminで手動でエクスポート(無変換)で全テーブルを出し新DBにのせかえるしか
→それまでは念のため通常Backupに加えて手動で時々保存すれ
→MySQLadmin>エクスポート>テーブル選択(同じ文字コードのもの)>実行
ps -aux
kill pid
#!/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
KEEPDAY=25
TODAY=`date +'%y%m%d'`
DBDUMP_FILE1=mysql.$TODAY
DBDUMP_FILE2=mysql_utf8.$TODAY
RMFILE1=mysql.`date -v -"$KEEPDAY"d +%y%m%d`.gz
RMFILE2=mysql_utf8.`date -v -"$KEEPDAY"d +%y%m%d`.gz
HOME_DIR=/hamehame/
BACKUP_DIR=$HOME_DIR/db_backup
cd $BACKUP_DIR
mysqldump -Q --host=192.168.1.2 \
--user=oreore --password=**** --default-character-set=binary name_db >\
$DBDUMP_FILE1
gzip $DBDUMP_FILE1 >/dev/null 2>&1
if [ $? != 0 -o ! -e $DBDUMP_FILE1 ]; then
echo "SUCCESS! MAYBE!"
rm -f $RMFILE1
exit 0
fi
Bシェルの記事も
https://www.bangboo.com/cms/blog/page_97.html
-----------------------------------------
■2010-03-09投稿
Like句ではバイナリか正規表現の検討
MySQLのLIKE文による抽出で期待通りの検索結果を出してくれなかった。
「絵コンテ」でヒットするのに「コンテ」ではヒットしなかった。
(原因)
MySQL4.0以下では日本語は単なるバイナリ列と同程度の扱いだった。MySQL4.1以上では正式に多言語に対応したようである。EUC-JPでも問題が出にくいみたいだ。
1)LIKEで検索したいフィールドに「BINARY」を付加する
SELECT a FROM b LIKE BINARY 'ABC';
2)CREATE TABLE 時に varchar(255) BINARY と指定しておく
(簡単な回避方法)
3)バイナリが嫌ならLIKEの代わりにREGEXPを使う。これがオススメ
SELECT a FROM b WHERE target LIKE '%~%'
ではなくて、
SELECT a FROM b WHERE target REGEXP '~'
他には文字コードを明記しておいた方がよいかも
CREATE TABLE `tablename` (
`id` int(11) NOT NULL auto_increment,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-----------------------------------------
■2007-05-24投稿
HTML出力、PHP、MySQL、全部UTF-8
その時、??と文字化けが起こったぁぁ
//mySQLの文字コード
照合順序 : utf8_general_ci
//mysqlクライアント。コマンドラインからチェック
mysql> SHOW VARIABLES LIKE 'char%';
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_results | utf8 |
| character_set_server | utf8 |
//phpソースコード・文字コード設定
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
//phpソースコード・PHP内部文字コードとクエリ文字コード設定
<?php //charactor code for php internal
mb_language("uni");
mb_internal_encoding("utf-8");
mb_http_input("auto");
mb_http_output("utf-8");
// database connection
if (!mysql_connect("localhost", "id", "pswd"))
{
die("Couldn't connect to MySQL");
}
if (!mysql_select_db("dbname"))
{
die("Couldn't connect to the database");
}
//charactor code for query
$sql = mysql_query("SET NAMES utf8");
$result = mysql_query($sql);
?>
Set Names文のクエリ発行がミソ。PHPで発行してみる
Posted by funa : 05:02 AM
| Web
| Comment (0)
| Trackback (0)
March 1, 2010
CSS Selectors
■* 全称セレクタ
すべての要素
h3 * em { color: red }
■ 子孫セレクタ
孫やそれ以下の要素に対しても有効
h1 em { color: blue }
<h1>携帯電話、<i>特に<em>i-mode</em></i>の爆発的な普及について</h1>
em要素 は青く表示、樹構造内で h1要素 に入れ子になっている em要素 はすべて対象
■> 子セレクタ
ある要素の直接の子供要素だけ
body > p { line-height: 1.3pt }
<body>
<ul>
<li>
<p>適用外</p>
</li>
</ul>
<p>適用</p>
</body>
■+ 隣接セレクタ
兄弟関係の要素、ある要素より前に登場する要素を兄要素、後に登場する要素を弟要素
p + div { margin-top: 0.7em }
<p>段落です。</p>
<div>レイアウトコンテナです。</div>
<div>二つ目のレイアウトコンテナです。</div>
この宣言が適用されるのは、一つ目のdiv要素だけ
■[] 属性セレクタ
そこに書かれた属性を持つ要素にマッチします
p[class] { margin-top: 0.7em }
<p class="tomato>
class属性 がある p要素 にマッチします(この場合class属性値は何でも良い)。
img[align=left] { margin-left: 3em }
align属性 の値が left の img要素 にマッチ
table[class~=favorite] { margin: 0em 3em }
<table class="favorite second under">
class属性値の一覧にfavoriteという値を含むtable要素
span[lang|=en] { font-style: italic }
ハイフン(-)で区切られた属性値のリストに対応したセレクタです
<span lang="en-US">アメリカ英語</span>
<span lang="fr, en">フランス語のような英語のような。</span>
■, セレクタのグループ化
同じ宣言を持つ複数のセレクタをグループ化したもの
h1, h2, h3 { font-family: sans-serif }
■: フィルタ セレクタの状態を表す
:ルート要素とは最上位階層に位置する要素のことで、HTML文書では全体をマークアップしている がルート要素
:root p { color:#FF0000; }
:not(~)は、指定した条件と一致しない要素にスタイルシートを適用するためのセレクタだ
html:not(:target)
html:not(:only-child:only-child) p { color:#FF0000; }
html:not([lang*=""]) p { color:#FF0000; }
:first-child その要素内の初めの子のみ
:last-child その要素内の最後の子のみ
:nth-child() 任意の数字番目の子、oddなら奇数、evenなら偶数番目など
:nth-last-child()
:before その要素の前に何かを追加する
:after その要素の後ろに何かを追加する
.clearfix:after{
content:".";
display:block;
height:0;
clear:both;
visibility:hidden;
} /*IE7以外のモダンブラウザ向け*/
■. クラスセレクタ
class属性の値がwarningであるdiv要素にマッチ
DIV.warning { color:#FF0000; }
■# IDセレクタ
一意(ID型)属性の値がmyidであるp要素にマッチ
p#myid { color:#FF0000; }
======================
■疑似要素
セレクターに付与し要素の特定の部分にスタイル付けができる、CSS2文法では:だったがCSS3で::になったものも
疑似要素の例 (::first-letter, ::first-line, ::before, ::after etc.)
疑似クラスの例 (:link, :hover, :visited, ,:active, nth-child(n), nth-of-type(n), :not() etc.)
a::after {
content: "→";
}
Posted by funa : 01:29 AM
| Web
| Comment (0)
| Trackback (0)
November 16, 2009
Ora Ora Ora Ora Ora
おっすオラ忘れ易いルール、無駄無駄無駄無駄無駄無駄ッ
■DML
DB製品毎のnullの扱いを事前に調べる(word != ‘検索値'やword = nullではnullにヒットしない、is not nullを使う等)
null値はもっとも小さな値、or大きな値(nullが含まれるかnullの件数を先に確認しておく、下に例を載せた)
集計関数はNULLを無視する(下に例を載せた)
文字列は'で囲む
取得したいカラムは集計関数に使われるカラムを除いて全てGroupBy句に入れる
集計関数の条件はhaving句を使用する(where句は元のデータに対するもの)、having句には集計関数が入る(下に例を載せた)
SQLワイルドカード:複数文字%,1文字_
WINワイルドカード:複数文字*,1文字?
エスケープ文字はescape句で設定。like句の後ろにつく。escape '\'
日付と文字列の変換が必要To_char関数とTo_date関数を使用する
to_char(column,'yyyy/mm/dd hh24:mi:ss')
to_date('2009/02/21','yyyy/mm/dd')
横幅を大きくするset line 150
縦を大きくするset pages 30
unionはdistinctが掛かる、全取得はunion all
inner join onは両方のテーブルにあるものだけ、どちらかだけにあるのは無くなるイメージ
left (outer) join onは左側のテーブルにしかないものも表示、左に右の該当部をくっつけるイメージ
right (outer) join onは右側のテーブルにしかないものも表示、右に左の該当部をくっつけるイメージ
full outer join onは全ての行を表示
trancateは高速だがロールバックできない、deleteはロールバックできる、論理削除がindexメンテコスト低で良い
多対多のSQLが含まれないか確認する(下に例を載せた)
■テーブル結合4種
1対1、1対多の結合を行う
1対多でも行数が増えるが、多対多は全組合せになり行数が比例関数的に増えてしまう
多対多になるのはテーブル設計が悪いのでは?
1)inner join - on () 両方あるものを表示、欠けがでる
2)left outer join - on () どちらかは欠けがなく表示
3)right outer join - on () どちらかは欠けがなく表示
4)full outer join - on () 欠けがなく表示
select URIID,NAME,UKYAKUID from URIAGE left outer join TORIHIKI
on (URIAGE.UKYAKUID = TORIHIKI.ID)
select URIID,NAME,UKYAKUID from TORIHIKI right outer join URIAGE
on (URIAGE.UKYAKUID = TORIHIKI.ID)
select URIID,NAME,UKYAKUID from TORIHIKI full outer join URIAGE
on (URIAGE.UKYAKUID = TORIHIKI.ID)
select 伝票番号,行番号,処理日,商品名,担当者名,顧客名,数量 from 売上データ
left outer join 商品マスタ on 売上データ.商品ID = 商品マスタ.商品ID
left outer join 担当者マスタ on 売上データ.担当者ID = 担当者マスタ.担当者ID
left outer join 顧客マスタ on 売上データ.顧客ID = 顧客マスタ.顧客ID
order by 伝票番号,行番号
■なおjoin on句 と where句での結合の違い
1)select * from A, B where A.a = B.a and A.c = 3;
2)select * from A inner join B on A.a = B.a where A.c = 3;
両者は同じ結果、前者の方が古くからある構文,後者が新しい構文。だがOuter joinは下記にある通り違う
https://okwave.jp/qa/q8090979.html
■WHEREとJOIN ONで条件を指定した場合の違い
SELECT * FROM movies LEFT OUTER JOIN counts ON counts.movie_id = movies.id WHERE counts.date_at = '2012-12-16';
WHERE句はJOINが終わってから評価される→Outer joinでも12/16でない映画が含まれずLEFTが欠ける
この問題の解決にはWHERE句に条件を指定するのでなくJOIN ONの追加条件として指定する
SELECT * FROM movies LEFT OUTER JOIN counts ON counts.movie_id = movies.id AND counts.date_at = '2012-12-16';
Outer joinしLEFTの全映画が出力したいので、結合前に12/16以外のカウントを外した上で結合させると逆にLEFT側は全部でる(RIGHTの条件で絞った上でLEFT OUTER JOINだとRIGHTがNULLでもLEFTが出る)
http://hakutoitoi.hatenablog.com/entry/2012/12/17/005208
■多対多、1対多の行数
社員と職域、社員と手当、それぞれ結合しても多の行数(1x多)になる
こんな設計や操作はするなという事(多x多の行数になる、多対多の結合は行わないこと)
-- データ挿入:社員
INSERT INTO x_employee (no,name) VALUES (1, '田中');
INSERT INTO x_employee (no,name) VALUES (2, '鈴木');
INSERT INTO x_employee (no,name) VALUES (3, '佐藤');
-- データ挿入:職域(兼任が発生)
INSERT INTO x_joblevel (no,res) VALUES (1, '部長');
INSERT INTO x_joblevel (no,res) VALUES (1, '課長');
INSERT INTO x_joblevel (no,res) VALUES (2, '平');
-- データ挿入:手当(一人に幾つか付く)
INSERT INTO x_compensation (no,allow) VALUES (1, '住宅');
INSERT INTO x_compensation (no,allow) VALUES (1, '交通');
INSERT INTO x_compensation (no,allow) VALUES (2, '住宅');
-- 1対多(田中が兼任のため田中分が2行、鈴木1行で都合3行、1対多だとまだ兼任と理解ができる)
select * from x_employee
inner join x_joblevel on x_employee.no = x_joblevel.no
-- 多対多(田中兼任2行x田中手当2行の小計4行、鈴木の1行で都合5行、田中だけで4行でるとマトリックスの意味が不明になる)
select * from x_employee
inner join x_joblevel on x_employee.no = x_joblevel.no
inner join x_compensation on x_employee.no = x_compensation.no
■Group by/having/where
取得したいカラムは集計関数に使われるカラムを除いて全てGroupBy句に入れるの例
select distinct boss from fun_test_data
select department, avg(salary) from fun_test_data group by department
select boss, avg(salary) from fun_test_data group by boss
select department, boss, avg(salary) from fun_test_data group by department, boss
集計関数の条件はhaving句を使用する(where句は元のデータに対するもの)、having句には集計関数が入る例
select department, count(department), avg(salary) from fun_test_data where department!="営業" group by department;
select department, count(department), avg(salary) from fun_test_data where department!="営業" group by department having avg(salary) > 45;
※moreにデータをDDLを置いておくので操作して感じる
集計関数にはsum() count() avg() stddev()標準偏差 variance()分散etc..がある
nullを無視するので、3件が100, null, 200のとき平均は150となる、nullを0にする事
SELECT AVG(NVL(SURYO,0)) AS 平均, COUNT(NVL(SURYO,0)) AS 件数 FROM TEST1
data2にnullがありカウントしようとするがnullはカウントされず1行目はダメ、件数はkeyをカウントせよ
select COUNT(DATA2) from EXAMPLE_TABLE where DATA2 is NULL
select COUNT(ID) from EXAMPLE_TABLE where DATA2 is NULL
※SQLはバグかどうか分からず失敗かどうか分かりにくい→計算式を書いてからSQLを書く
集計値の集計を行う際には集計順序に注意せよ | 実践から学ぶ分析の落とし穴 - GiXo Ltd.
■サブクエリ(副問い合わせ)
どこでもOK、any() in() some() exists() not exists()等がある、mysqlにはminus() except()はない
/// where条件が1件
SELECT 受注番号 FROM 受注表 WHERE 商品コード = (SELECT 商品コード FROM 商品表 WHERE 商品名 = 'JUICE');
/// where条件が複数
SELECT 受注番号 FROM 受注表 WHERE 商品コード IN (SELECT 商品コード FROM 商品表 WHERE 単価 = 400);
/// havingに
SELECT 顧客コード,COUNT(DISTINCT 受注番号) FROM 受注表 GROUP BY 顧客コード HAVING 受注個数 < (SELECT MIN(受注個数) FROM 受注表 WHERE 顧客コード = '002');
/// fromに
SELECT MAX(AVG_J) AS MAX_AVG FROM (SELECT AVG(受注個数) AS AVG_J FROM 受注表 GROUP BY 顧客コード) ;
/// selectに(出力表のカラム数は1個だけで、これが変わる等はできないかと)
SELECT 顧客コード,AVG(受注個数), (SELECT AVG(受注個数) FROM 受注表) FROM 受注表 GROUP BY 顧客コード;
selectサブクエリにカラムを一つづつ足せば複数も可だが
select name, res,
(select allow from x_compensation where x_compensation.no = x_employee.no limit 0, 1),
(select allow from x_compensation where x_compensation.no = x_employee.no limit 1, 1)
from x_employee inner join x_joblevel on x_employee.no = x_joblevel.no inner join x_compensation on x_employee.no = x_compensation.no
/// 相関サブクエリ(出力表のカラム数が変わる等はできないかと)
メインクエリの行ごとにサブクエリを実行、結合をサブに記入している、違う書き方ができるかも知れないがサブからでなくメインから考えている感じ
例1)
SELECT * FROM 商品表 AA WHERE '20010401' IN (SELECT 納品日 FROM 受注表 BB WHERE AA.商品コード = BB.商品コード);
例2)
SELECT SUM(受注個数),納品日 FROM 受注表 PP GROUP BY 納品日 HAVING SUM(受注個数) > (SELECT 150 + MAX(受注個数) FROM 受注表 QQ WHERE PP.納品日 = QQ.納品日);
■Union
UNION句でマージする複数のSELECT文は、(1)SELECT句のカラム数が同じこと(2)カラムのデータ型が同じか、変換可能であること
select shit from ass union all select kuso from ketsu
■SQLはカラム数の増加数で構成考える?
left outer joinはカラム数がカラム数の合計から共通のjoin onのカラム数を引いた数(行数は同じ)
full outer join はカラム数がカラム数の合計から共通のjoin onのカラム数を引いた数(行数はleftの要素数にrightの要素数を合計したもの)
unionは重複を除外し表を足し合わせるため行数が両表の合計行数(カラム数は合致必要でカラム数は変わらない)
unian allは重複を除外せず表を足し合わせるため行数が両表の合計行数(カラム数は合致必要でカラム数は変わらない)
cross joinはカラム数が両表のカラム数の合計、行数は両表の行数の掛け算
再帰的にSQL処理はcross joinし条件を付けるか?
標準SQLのFrom句のカンマはcross joinとなる
with句は副問い合わせを見やすくしたもの
distinctで(組み合わせで)一意になる行のみにし重複を省く
UNION とUNION ALLの違い - Qiita
CROSS JOIN (クロス結合)を使ってデータを取得する - JOIN (結合)を使いこなそう - SQL Server 入門 (sql55.com)
SQLのDISTINCTとは?(OracleやMySQLで使用する方法) | IT職種コラム (it-kyujin.jp)
■テーブル設計、制約
CONSTRAINT pk_uriage PRIMARY KEY (伝票番号, 行番号),
CONSTRAINT fk_shohin FOREIGN KEY (商品ID) REFERENCES 商品マスタ(商品ID)
CONSTRAINT ck_gender CHECK (性別=0 OR 性別=1)
制約は列に指定しても、うしろで指定してもどちらでもよい
CONSTRAINTのキー名を省略するとオラクルが勝手につける
主キーにはNULLは入らない
ユニークキーにはNULLを入れてもよい
NOT NULLの未入力はエラー
■シーケンス
シーケンスはオブジェクトとして表とは別に作成する
デクリメントはできないので修正はDROPして作成し直す
DUALはダミー表
nextvalはインクリした後の値
currvalは現在地
create sequence testseq
select testseq.nextval from dual
select testseq.currval from dual
insert into URIAGE (URIID,URIDATE,UKYAKUID) values (testseq.nextval,'09-11-16','101')
drop sequence testseq
■ビュー
頻繁に行われるような問い合わせをスキーマに格納しておく、パフォーマンスが上がる場合がある
集約等をしなければパフォーマンスには問題がない。次を使うとパフォーマンスが落ちる。OLAP 関数(RANK, DENSE_RANK, ROW_NUMBER 等)、集約関数(AVG, COUNT, SUM, MIN, MAX)、集合演算子( UNION, INTERSECT, EXCEPT 等 )
ビューは検索だけでなく、データの追加、更新、削除も行える※使用しない方が良い?
create view 売上ビュー as
select 伝票番号,行番号,処理日,商品名,担当者名,顧客名,数量 from 売上データ
left outer join 商品マスタ on 売上データ.商品ID = 商品マスタ.商品ID
left outer join 担当者マスタ on 売上データ.担当者ID = 担当者マスタ.担当者ID
left outer join 顧客マスタ on 売上データ.顧客ID = 顧客マスタ.顧客ID
order by 伝票番号,行番号
select * from 売上ビュー
■用語
concat()…CONCATENATE 文字連結
coalesce()…コーレス、合体する、与えられた引数のうちNULLでない最初の引数を返す
LPAD() RPAD()…文字の右詰左詰め
OLAP…OnLine Analytical Processing=分析、キューブ
■インデックス
1)インデックスが効かない
関数 where datediff(now(),mod_date)>180
式 where
col1 / 2 = 0
否定構文 where col1 != 3
Like検索(前方一致除く) where col1 like
'%string%'とかwhere col1 like '%string'とか
2)複合インデックスでは指定順が重要
index
a
create index idxA1 on tbl (col1);
create index idxA2 on tbl
(col2);
-> where col1 = x > idxA1が使用される
-> where col2 = x >
idxA2が使用される
-> where col1 = x AND col2 = x >
idxA1か2のどちらかが使用される
index b
create index idxB1 on tbl (col1,
col2);
-> where col1 = x > idxB1が使用される
-> where col2 = x >
インデックスは使用されない
-> where col1 = x AND col2 = x >
idxB1が使用される,indexA1,A2より高速
index c
create index idxC1 on tbl (col2,
col1);
-> where col1 = x > インデックスは使用されない
-> where col2 = x >
idxC1が使用される
-> where col1 = x AND col2 = x >
idxC1が使用される,indexA1,A2より高速
■RFM(recency frequenctry monetary)
SELECT name, MAX(date), MIN(date) FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no GROUP BY name ORDER BY MAX(date) DESC
SELECT name, count(x_bill.no) FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no GROUP BY name ORDER BY count(date) DESC
SELECT name, sum(total_bill) FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no GROUP BY name ORDER BY sum(total_bill) DESC
SELECT name, SUM(price * unit) FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY name ORDER BY SUM(price * unit) DESC
↓
SELECT name, MAX(date), count(DISTINCT x_bill.no), SUM(price * unit) FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY name ORDER BY SUM(price * unit) DESC
※購入頻度は多対多で重複が出るのでカウントはdistinct primaryKeyで重複を含めない
↓順位を点数化のため、MySQLにはRownumがなく変数を使いシンプルな表でまず作った
SET @rownum_recent=0;
SELECT @rownum_recent:=@rownum_recent+1 as rank_recent, no, name, recent from
(SELECT x_employee.no, name, MAX(date) as recent FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no GROUP BY name ORDER BY MAX(date) DESC) as t1
SET @rownum_frequent=0;
SELECT @rownum_frequent:=@rownum_frequent+1 as rank_frequent, no, name, frequent from
(SELECT x_employee.no, name, count(x_bill.no) as frequent FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no GROUP BY name ORDER BY count(date) DESC) as t2
SET @rownum_money=0;
SELECT @rownum_money:=@rownum_money+1 as rank_money, no, name, money from
(SELECT x_employee.no, name, SUM(price * unit) as money FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY name ORDER BY SUM(price * unit) DESC) as t3
↓まとめる(user_noで結合した、別名を付ける計算カラムよりどの元の表かが重要かもLeftかRight joinかで)
SET @rownum_rank=0;
SET @rownum_recent=0;
SET @rownum_frequent=0;
SET @rownum_money=0;
SELECT @rownum_rank:=@rownum_rank+1 as rank, rank_recent+rank_frequent+rank_money as least_score_wins, t1_r.no as user_no, t1_r.name, recent, frequent, money, rank_recent, rank_frequent, rank_money
FROM (
SELECT @rownum_recent:=@rownum_recent+1 as rank_recent, t1.no, t1.name, recent
FROM (SELECT x_employee.no, x_employee.name, MAX(date) as recent FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY x_employee.no, x_employee.name ORDER BY MAX(date) DESC) as t1
) as t1_r
LEFT OUTER JOIN (
SELECT @rownum_frequent:=@rownum_frequent+1 as rank_frequent, t2.user_no, t2.name, frequent
FROM (SELECT x_bill.user_no, x_employee.name, count(distinct x_bill.no) as frequent FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY x_bill.user_no, x_employee.name ORDER BY count(distinct x_bill.no) DESC) as t2
) as t2_f
ON t1_r.no = t2_f.user_no
LEFT OUTER JOIN (
SELECT @rownum_money:=@rownum_money+1 as rank_money, t3.no, t3.name, money
FROM (SELECT x_employee.no, x_employee.name, SUM(price * unit) as money FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY x_employee.no, x_employee.name ORDER BY SUM(price * unit) DESC) as t3
) as t3_m
ON t2_f.user_no = t3_m.no
ORDER BY least_score_wins asc
■NULLの件数を事前に数えておく
SELECT *
FROM (SELECT 'value', count(COALESCE(value,0)) FROM bangboo_data.x_data WHERE value IS NULL)
union all
(SELECT 'value2', count(COALESCE(value2,0)) FROM bangboo_data.x_data WHERE value2 IS NULL)
union all
(SELECT 'v_no_null', count(COALESCE(v_no_null,0)) FROM bangboo_data.x_data WHERE v_no_null IS NULL)
↑が安全策
SELECT count_null_1, count_null_2
FROM (SELECT value, count(COALESCE(value,'')) as count_null_1 FROM x_data WHERE value IS NULL GROUP BY value) as t1,
(SELECT value2, count(COALESCE(value2,'')) as count_null_2 FROM x_data WHERE value2 IS NULL GROUP BY value2) as t2
※From A, B, C でクロス結合となり全組み合わせがでる、1行ずつならOKだが、、
※SQLはカウント0件をグルーピングできない、表示自体存在しないことになるから、↑は少々危険で↓で
SELECT count_null_1, count_null_2
FROM (SELECT count(COALESCE(value,'')) as count_null_1 FROM x_data WHERE value IS NULL) as t1,
(SELECT count(COALESCE(value2,'')) as count_null_2 FROM x_data WHERE value2 IS NULL) as t2,
(SELECT count(COALESCE(v_no_null,0)) as count_null_3 FROM x_data WHERE v_no_null IS NULL) as t3
■SQL一覧
https://qiita.com/tatsuya4150/items/69c2c9d318e5b93e6ccd
UPDATE テーブル名 SET カラム名 = 値, カラム名 = 値 WHERE id = 1
INSERT INTO テーブル名 VALUES ('1')DELETE FROM テーブル名 WHERE 条件
intersectは重複するもの SELECT name FROM ユーザー1 INTERSECT SELECT name FROM ユーザー2
※unionは和集合、exceptは差集合、intersectは積集合
Posted by funa : 06:54 PM
| Web
| Comment (0)
| Trackback (0)
October 29, 2009
Use + Able + T
俺のを見てスムーズクリミナルだとヤコブニールセンが言ったとか
-
ユーザビリティ
Posted by funa : 09:04 PM
| Web
| Comment (0)
| Trackback (0)
July 22, 2009
A Rainbow Between Clouds
形態素解析Mecabを使いマルコフ連鎖で文章を生成してみようかと、
WinじゃなければMecab PHP拡張モジュールを使う方がいいのだろうが
1)MeCabのサイトからwindows版をDLしてインストール
2)環境変数のPathにC:\Program Files\MeCab\binを追加すると
cmdでmecabと打っただけで実行される
>mecab input.txt > out.txt
3)PHPのコードでは、こう。バッククォートで囲むとコマンド実行される
$output = `mecab "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\dbcrawler\test.txt" > "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\dbcrawler\results.txt"`;
?>
このタイトル使いたかっただけ、
雲(クラウド)にかかる虹を探していますwww
EUCやってるやん、俺も提唱し続けry
http://itpro.nikkeibp.co.jp/article/COLUMN/20090702/333080/
///余りが出る 割り算オンリー計算機
ありそうでなかったので、作った
http://pimpub.jpn.org/divide/
Posted by funa : 08:08 PM
| Web
| Comment (0)
| Trackback (0)
June 20, 2009
No sense of direction
OSSをAPIと考えたり、WEBサービス系のAPIを使ったりで
決済関係をやらなアカン、俺の中で決済が熱い、熱いだけやけど
-WEB POS OSS
ドキュメンタリー?越前屋俵太だろ、探偵ナイトスクープ、Punk'd、Boiling Pointそんなバイブが見たい
http://www.sonymusic.co.jp/etv/matsumachi/index.html
何でもほのめかしゃぁ、エエってもんでもないでwwwwwwwwww
Posted by funa : 05:34 PM
| Web
| Comment (0)
| Trackback (0)
March 25, 2009
Optimost
グーグルのマニュアルは良くわからん。こういう事か?実際触ってないから間違っているかも知れない。
ウェブサイト オプティマイザー
https://www.google.com/analytics/siteopt/splash?et=resetどんな訴求方法が効果があるかABテストと多変量テストで判別する
基本編→→→→
■ABテスト
AページとBページあるいはCページのどれが成果を上げるのか?
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=62999&hl=jaAページ URLとコンバージョンページ URLを管理サイトで指定する
AページにヘッダースクリプトとBC..ページを指定する
BC..ページ、コンバージョンページにフッタースクリプトを指定
■多変量テスト
どの要素が、あるいはどの組み合わせが効果があるのか沢山のパーツの中から発見する
最適化したい要素をスクリプトタグで囲む、あとは管理サイトでパーツを管理する
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61149&hl=ja変更前: <img src="/images/smiling_child.jpg">
変更後: <script>utmx_section("Image")</script>
<img src="/images/smiling_child.jpg">
</noscript>
上級テクニック編→→→→
■閲覧時間をコンバージョンとして扱うようにする
一定時間閲覧すればコンバージョンとしてカウントする(購買でなくデモや動画向き)
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=74345&hl=ja■コンテンツ切り替え(多変量テストと同じか?)
例えば、マネキン、屋外画像等を切り替えてどの画像が有効か判断する
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61201&hl=ja■ランディングページからの行き先を知る
単一のテストページに複数のコンバージョンページを指定
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61200&hl=ja■フォーム送信をコンバージョンとして扱うようにする
テストページにフォームのonSubmitにスクリプトを噛ませる
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61198&hl=ja■サイト全体に係るグローバルデザインを変更したときの効果測定方法
全テストページに共通のコンバージョンポイントを指定したAZテストで率を見る
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61203&hl=ja■参考資料、ABヒント
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61205&hl=jahttp://www.google.com/intl/ja/websiteoptimizer/articles.html
Posted by funa : 08:34 PM
| Web
| Comment (0)
| Trackback (0)
March 25, 2009
Google Other---s
グーゴー、あっざーっス。
アナリティクス
http://www.google.com/analytics/ja-JP/
アクセスを解析しレポートする
■解析ページの指定
■管理サイトでのコンバージョン設定(目標到達遷移、購入までのセッション数、購入までの日数)
■管理サイトでのフィルタ設定(不要なものを弾く)
■管理サイトでのサイト内検索設定
===============================================
アドワーズ
https://adwords.google.com/
ネット広告出稿
■管理サイトで予算を計上しキャンペーンを作成してキーワードを購入する
■コンバージョントラッキングを設定(コンバージョンの内容を分析)
■1日の予算でなく、ひとまず1万円分出稿するといった、無期限の金額上限を設けることは可能でしょうか?
-お支払い方法を前払いで1万円お振込みいただくと、確実。
-ひと月に1日予算x30を超える請求がされることはない。予算÷30で一ヶ月後に止める。
-予算を毎日設定し直す、1万円>5700円>3200円と減った分を引いた分を予算とする。
■フリーチケット使用の注意
-5000円から引かれ始め0円を超えると加算され課金される、訳がわからない。無料分なのかそうでないのかは価格概要で確認すること
-0円を超えるといきなりクリックが多くなることがあり予想外の金額となる
-期間を設定していてもアメリカ時間なのか思う通りに終了しない
===============================================
サイトサーチ
http://www.google.com/sitesearch/
サイト内検索の分析レポートする
===============================================
ウェブマスターツール
https://www.google.com/webmasters/tools/dashboard
グーグルSEO対策
Posted by funa : 08:32 PM
| Web
| Comment (0)
| Trackback (0)
December 20, 2008
Tora Tora Tora
Posted by funa : 09:05 PM
| Web
| Comment (0)
| Trackback (0)
October 7, 2008
NO, WE CAN'T.
MTもモ●ゲーもC*pyったし。
さわ郎。Amazon Web Service
コピ郎。EC-C*be, Opt*most, H*atmap, visi*nalist
これでChangeさ。
あと、Segmentation&Recommendationエンジンだ。
そう神々の遊びだ。
Posted by funa : 07:03 AM
| Web
| Comment (0)
| Trackback (0)