SQLの窓

2016年05月31日


DB のデータを簡単に沢山作る方法は inner join

ページ処理のテストを行う為に、元を 7 件として、56 件のデータに増やす方法です。それぞれの SQL は、RDBMS 毎に動作するように書き換えれば実行可能です。

元のテーブル

既に 7 件のテストデータがあり、phpMyAdmin でエクスポートしています。phpMyAdmin はたいていのレンタルサーバで用意されていると思いますし、最新(4.6.2/php5.5以上)をダウンロードして解凍してアップロードするだけで動作します( PHP6 の場合は、最新の phpMyAdmin は動作しないようでした。Windows PC でも普通に動きます )
CREATE TABLE IF NOT EXISTS `board` (
  `row_no` serial,
  `body` varchar(1000),
  `subject` varchar(200),
  `from` varchar(20),
  `pdate` datetime,
  `cdate` datetime,
  primary key(`row_no`)
)

※ row_no は自動採番列です

データ

以下はエクスポートしたデータです。
-- phpMyAdmin SQL Dump
-- version 4.4.15.5
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: 2016 年 5 月 28 日 13:26
-- サーバのバージョン: 5.6.17
-- PHP Version: 5.4.13

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `lightbox`
--

--
-- 挿入前にテーブルを空にする `board`
--

TRUNCATE TABLE `board`;
--
-- テーブルのデータのダンプ `board`
--

INSERT INTO `board` (`row_no`, `body`, `subject`, `from`, `pdate`, `cdate`) VALUES
(3, '「日本と米国が力を合わせて、世界の人々に希望を生み出すともしびとなる」。安倍晋三首相は27日、オバマ米大統領とともに訪れた広島市の平和記念公園で、強固な日米同盟をアピールした。昨年4月、米上下両院合同会議での演説で先の大戦への「痛切な反省」を表明した首相からは、今回のオバマ氏の広島訪問を、日米関係を新たな段階に進める節目にしたい思惑が透けて見える。', '<伊勢志摩サミット>閉幕 親密な日米 首相腐心', '毎日新聞', '2016-05-28 13:15:04', '2016-05-09 11:52:51'),
(10, '電子コミック販売サイト「漫画onWeb」や電子書籍取次サービス「電書バト」などを運営する漫画家の佐藤秀峰さんは、2月に伝書バトが実施した、電子コミック131冊を各11円で販売するセールの効果で、2月の売り上げ総額が3億円を超えたことを明らかにした。売り上げトップだった佐藤さん本人には、1億3000万円以上の印税が入ったという。', '電子コミック「11円」セールで売り上げ3億円超 トップ作家に印税1億3000万円 「常識打ち破る数字」', 'ITmedia ニュース', '2016-05-28 13:22:37', '2016-05-14 20:07:14'),
(11, 'タカタ製エアバッグの欠陥問題で、国土交通省は27日、火薬の劣化を防ぐ乾燥剤が入っていないエアバッグについて、新たに約700万台がリコール(回収・無償修理)対象になると明らかにした。\r\n\r\nメーカー各社に順次リコールを求め、2018年度末までに改修を済ませたいとしている。\r\n\r\n一連の問題では、国内で延べ約1259万台がリコールされており、対象は2000万台規模に達することになる。\r\n', 'リコール2000万台規模に=新たに700万台、タカタ製エアバッグ', '時事通信', '2016-05-28 13:18:36', '2016-05-14 20:08:07'),
(12, '酒の行き過ぎた安売りに待ったをかける規制は、大手スーパーやディスカウント店などの安値攻勢で経営が苦しくなった「町の酒屋さん」を救済する狙いがある。だが、厳しい罰則を恐れて、業者が萎縮し、健全な価格競争まで妨げてしまうリスクもはらんでいる。', '改正酒税法成立 量販店萎縮、価格形成ゆがみも', '産経新聞', '2016-05-28 13:17:26', '2016-05-14 20:08:11'),
(14, '広島の原爆資料館はオバマ米大統領が訪れた後の27日夜に記者会見し、オバマ氏が佐々木禎子さんの折り鶴や資料などを見て、自身も4羽の折り鶴を資料館に寄贈したと説明した。佐々木禎子さんは、原爆症で12歳で亡くなり、「原爆の子の像」のモデルとして知られている。政府関係者によると、大統領が自ら折ったもので、小中学生に手渡したという。志賀賢治館長は「感慨深げな表情で、岸田文雄外相の説明を聞いていた。視察時間は短く残念だったが、伝えたかったことを伝えられたのではないか」と語った。', '<米大統領広島訪問>オバマ氏、4羽の折り鶴 その思いは…', '毎日新聞', '2016-05-28 13:16:09', '2016-05-09 11:52:51'),
(21, '日立製作所は27日、中国・広州市の高層ビル「広州周大福金融中心」向けに受注したエレベーターが分速1200メートル(時速72キロ)を記録し、世界最高速度を達成したと発表した。14日に行った走行試験で世界最高速度を達成。今秋の稼働に向け、据え付けや調整作業を進めている。', '日立、エレベーターの最高速度達成', 'SankeiBiz', '2016-05-28 13:19:27', '2016-05-14 20:08:07'),
(22, 'レンタルビデオ店「TSUTAYA(ツタヤ)」を運営するカルチュア・コンビニエンス・クラブ(CCC)と民泊仲介サイト世界最大手の米Airbnb(エアビーアンドビー)が27日、事業提携を発表した。訪日観光客の増加で宿泊ニーズが高まる中、「ツタヤ」や「Tポイント」を展開するCCCのノウハウで日本市場を開拓し、一般住宅に有償で客を泊める民泊サービスの定着を目指す。', '米民泊サイト最大手が日本進出でツタヤと提携 外国人の訪日客に照準', '産経新聞', '2016-05-28 13:20:24', '2016-05-28 13:20:24');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


inner join で増殖して追加

inner join で条件を書かなければ、n 行あれば、n x n 行の結果を返します。その際、同じ表を a と b で別名定義して自己結合させます。

結果の行は、board の 定義に合わせて a 表のみから取得して、row_no は 自動採番なので null as row_no として先頭に作成します。

その結果をさらに board に insert する事によって、row_no は、新しく自動採番された行として挿入されます。その結果 a( 最初の行数 ) + n( 元の行数 ) * n( 元の行数 ) の行を登録する事になります。
insert into board
select
	null as row_no,a.body,a.subject,a.from,a.pdate,a.cdate
	from board a
inner join `board` b
もう一回すると 3192 件になるので、これ以上は注意して実行する必要があります。

乱数関数で日付データのみ、ばらつかせる

ここではさほど厳密にバラつかせる必要は無かったので、時間部分に適用しています。
※ PIPES_AS_CONCAT は、文字列結合に Oracle と同じ || を使用可能にする設定です。
SET sql_mode='PIPES_AS_CONCAT';

update board set pdate = cast('2016/05/28 0' || truncate(Rand()*10,0) || ':00' as datetime)



posted by lightbox at 2016-05-31 19:36 | MySQL | このブログの読者になる | 更新情報をチェックする

Java、PHP、jQuery : 最近の記事と関連する記事のまとめ / インデックス

Java : WindowBuilder

HttpPost・JOption
Java WindowBuilder から超簡易掲示板(CSVタイプ)投稿

Google Gson・HttpGet・テーブル
WindowBuilder のテーブルコントロールにインターネットから JSON データを読み込んで処理するテンプレート

MySQL・テーブル
WindowBuilder テンプレートのテーブルコントロールに MySQL のデータを表示する

テンプレート・インポート
Eclipse 4.4 Pleiades + WindowBuilder テンプレート / アプリケーションウインドウとダイアログ / インポート手順



HttpGet クラス(ソースコード)
HttpPost クラス(ソースコード)


1からのプロジェクト作成方法


Java : Android Studio

<include>・HttpPost
tools.jar の callHttpGet のテストと include による画面再利用と HttpPost クラスで掲示板書き込み / Android Studio

コンボボックス・リスト処理
Android の Spinner に関するいろいろな実装と知識 / Android Studio


インターネット・画像
AsyncTask を継承して、Drawable を取得する専用クラスを作成する : Android Studio

ボタン
Android Studio でボタンの処理を追加する4つの方法 : Android Studio 2.0

第二画面
新しい Activity を追加して MainActivity より呼び出し、MainActivity に戻る処理

MessageBox
tools.jar を使用して MessageBox 処理

プロジェクト作成
tools.jar を使用して基本的なアクションを簡単に実装する


tools.jar ソースコード ( Tools.java, Tools2.java, TestArrayAdapter.java, AndroidTools.java )

NAVER
Android Studio : jar の作成と実行テスト
Android Studio の設定
Android Studio 予習開始!(良く使う機能・ショートカット・メニュー)


Java : コンソール

インターネット・アクセス
Java のコンソールで NAVER の RSS を取得して、title 部分を正規表現で加工して表示するサンプル

メール送信
java をコマンドプロンプトからビルドして実行するサンプル。( メール送信が初心者には楽しいはず )


PHP

DB・jQuery
PHP で 自家製 API を作成して jQuery の簡単なコードで更新処理を行うサンプル

掲示板・CSV・JSON
超簡易掲示板 : 保存タイプは CSV

掲示板・JSON
超簡易掲示板 ( JSON ) : PHP

キャラクタセット
PHP で HTML数値エンティティを、目的のキャラクタセットの文字列に変換する

trim・正規表現
PHP で漢字スペースと通常スペースのトリム


jQuery

音声認識・ブックマークレット
Google Chrome で音声認識の結果をブログの投稿テキストエリアに転送するブックマークレット

ブックマークレット
ブックマークレット IFRAME ユニット作成ツール

ブックマークレット
イラストAC用、一括タグ転送ブックマークレット

音声認識
Google Chrome での音声認識処理

Web Speech API
ほぼ、Google Chrome 限定ですが Web Speech API の現時点での実装と問題点回避方法

EASELJS
EASELJS を使用した画像の分割と分割されたエリア毎のアニメーション / createjs.Ticker の reset と init はうまく動きませんでした

EASELJS
EASELJS を使用した画像の縮小とトリミングと角丸マスク / 画像は new Image でイベント処理して画像サイズを取得します

一覧・Picasa API
jQuery Columns を使って、Picasa API より アルバム一覧を表示する

jquery.ajax-combobox
jquery.ajax-combobox(オートコンプリートとドロップダウンリストを組み合わせたコンボボックス) を使用して、入力可能なコンボックス( しかもリストはページャ付き )

jquery.ajax-combobox
jquery.ajax-combobox で JSON をデータに使う場合、複数項目を検索対象にする為の簡単な改造


Kintone

kintone で画像を表示する / PC と スマホで少し違います。PC ではスペース項目、スマホでは、スマホ用ヘッダスペースを使用します

kintone JavaScript API で ルックアップ先が更新された場合の参照元を全て更新する

kintone API のトークンを使った PHP コードの注意点

kintone の開発者ライセンスを取得しました。一年有効で、見たところ4年ぐらい使えそうです


その他

A 要素と CSS だけでボタンを表現する 『BUTTONS』

BUTTON 要素と CSS だけでアイコンボタンを表現する 『BUTTONS』

utf8 文字ツール の 文字参照リンクの作成方法

レンタルサーバで PHP のバージョンを 5.4 から 5.6 に変更する時の注意事項

IFRAME 内に外部の javascript を読み込んで画面を作成する / document.write での構築



posted by lightbox at 2016-05-31 13:48 | 記録 | このブログの読者になる | 更新情報をチェックする

Java のコンソールで NAVER の RSS を取得して、title 部分を正規表現で加工して表示するサンプル

java.util.regex.Matcher
java.util.regex.Pattern

groupCount で取得されるのは、部分一致した数なので、() を使用しなければ、戻り値は 0 となります。また、その場合は group() で取得できますし。group(0) でも取得できます。

なので、常に pattern に一致する文字列は group(0) です。group(n) で n が 1 以上は部分一致となります。
よって、部分一致のみのループは、for( int i = 1; i <= m.groupCount(); i++ ) となります。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Main {

	public static void main(String[] args) {
		
		Pattern p;
		Matcher m;
		int len;

		print("処理開始");

		// NAVER の RSS
		String str = httpGet("http://matome.naver.jp/feed/hot");

        // 部分一致の無い パターンを生成
        p = Pattern.compile("<title>.+?</title>");
        m = p.matcher(str);

        // 部分一致した数( 0 になります )
        len = m.groupCount();
        print( Integer.toString(len) );

        while(m.find()) {
        	// 部分一致は無いので、m.group() で パターン
        	// に対する全体一致を取得
       		System.out.println(m.group());
        }

		print("------------------------------------------");
        
        // 部分一致のあるパターンを生成
        p = Pattern.compile("<title>(.+?)</title>");
        m = p.matcher(str);

        // 部分一致した数 ( 1になります )
        len = m.groupCount();
        print( Integer.toString(len) );
        
        while(m.find()) {
        	// m.group(0) はパターンに対する全体一致なので
        	// 1 から始めて部分一致のみ表示
        	for( int i = 1; i < (len +1); i++) {
        		System.out.println(m.group(i));
        	}
        }
        
		print("------------------------------------------");
        
        // 部分一致のあるパターンを生成
        p = Pattern.compile("(<title>)(.+?)(</title>)");
        m = p.matcher(str);

        len = m.groupCount();
        print( Integer.toString(len) );

        String partsString;
        StringBuilder buffer;
        while(m.find()) {
    		buffer = new StringBuilder();
        	for( int i = 1; i < (len +1); i++) {

        		// title 開始タグ
        		if ( i == 1) {
        			buffer.append("『");
        		}
        		// title 内容
        		if ( i == 2) {
            		partsString = m.group(2);
            		// String クラスの正規表現置換
            		// 文の区切り的文字で改行
            		partsString = partsString.replaceAll("[。、.…!?]+", "\n");
        			buffer.append(partsString);
        		}
        		// title 終了タグ
        		if ( i == 3) {
        			buffer.append("』");
        		}
        	}
    		print(buffer.toString());
    		print("");
        }

	}
	
	// ********************************
	// データ表示用
	// ********************************
	public static void print( String s ) {
		System.out.println(s);
	}	

	// ********************************
	// static void main より呼び出す為の
	// static な インターネットアクセス関数 
	// ********************************
	public static String httpGet( String s ) {

		String result = "";

		try {
			URL url = new URL(s);

			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			http.setRequestMethod("GET");
			http.connect();
			InputStream is = http.getInputStream();

			InputStreamReader isr = new InputStreamReader(is,"UTF8");
			BufferedReader br = new BufferedReader(isr);
			String line_buffer;
			StringBuilder sb = new StringBuilder();

			while(null != (line_buffer = br.readLine() )) {

				sb.append(String.format("%s\n",line_buffer));

			}

			br.close();
			isr.close();
			is.close();

			result = sb.toString();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;

	}	

}




posted by lightbox at 2016-05-31 12:00 | Java | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり