MySQL 1対他のデータをGROUP_CONCATで取得

MySQL

1対他のデータ構造を関連づけて表示する、というのはよくある動作ですが、GROUP BY とGROUP_CONCATを利用して、1対他のデータを取得してまとめる方法です。

文章で書いてもよくわからないと思うので、例をあげてみます。

ここに2つのテーブルがあります。
ninjyaテーブルと、skillテーブルです。
ninjyaテーブルには、忍者の名前、skillテーブルには必殺技の名前が格納されています。
一人の忍者は多くの必殺技を持つという、1対他のデータ構造になっています。

|>|ninjya テーブル|h
|id|name|h
|1|ナルト|
|2|サスケ|

#br

|>|>|skill テーブル|h
|id|ninjya_id|name|h
|1|1|螺旋丸|
|2|1|ナルトキック|
|3|2|千鳥|
|4|2|天照|

忍者の名前と、その必殺技のテーブルを表示したいとします。
ninjya_idで関連付けをし、GROUP_CONCATを次のように利用します。

 SELECT
 	ninjya.name, GROUP_CONCAT(skill.name)
 FROM
 	ninjya
 JOIN
 	skill on skill.ninjya_id = ninjya.id
 GROUP BY
 	ninjya.id

次のような結果が取得できます。
|name|GROUP_CONCAT( skill . name )|h
|ナルト|螺旋丸,ナルトキック|
|サスケ|千鳥,天照|

この例だと GROUP BYがいらないかのようですが、GROUP_CONCATを利用するために、グルーピングが必要です。

ちなみに、GROUP_CONCATがないと、ただ単にninjya.idから1件のデータを取得するだけです。

 SELECT
 	ninjya.name, skill.name
 FROM
 	ninjya
 JOIN
 	skill on skill.ninjya_id = ninjya.id
 GROUP BY
 	ninjya.id

上記のSQLの結果は次の通りです。
|name|name|h
|ナルト|螺旋丸|
|サスケ|千鳥|

ちなみに、一番最初のSQL文の出力結果が、フィールド名がGROUP_CONCATが入っていて見苦しいので、仕上げにエイリアスをつけておきます。

 SELECT
 	ninjya.name, GROUP_CONCAT(skill.name) as skill_name
 FROM
 	ninjya
 JOIN
 	skill on skill.ninjya_id = ninjya.id
 GROUP BY
 	ninjya.id

出力結果は次の通りです。
|name|skill_names|h
|ナルト|螺旋丸,ナルトキック|
|サスケ|千鳥,天照|

GROUP_CONCATのデフォルトはカンマ区切りですが、セパレーターは変更することができます。
http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html

MyISAMとInnoDBの違い

MySQL

MySQL MyISAMとInnoDBの違い

MySQLで利用するテーブルのストレージエンジンにはMyISAMとInnoDBがありますが、どのようなケースにどちらを選べばいいか、メモしておきます。
デフォルトではMyISAMです。

MyISAMの利点と問題点

  • 利点…シンプル、高速に動作、フルテキスト検索に対応
  • 欠点…トランザクションや外部キー制約をサポートしない、REPAIR TABLEで修正できることが多いがクラッシュ時に使えなくなる、テーブルレベルでロックをかけるという点でロックの粒度が荒い

InnoDBの利点と問題点

  • 利点…トランザクションをサポート、外部キー制約が装備されている、クラッシュ時のリカバリに対応、列レベルでロックを実施
  • 欠点…フルテキスト検索ができない、パフォーマンスが悪い

参考、引用
http://journal.mycom.co.jp/news/2009/03/27/048/index.html
http://www.thinkit.co.jp/free/article/0608/1/2/

データ整合性が求められるデータベースにおいては、InnoDBを利用し、パフォーマンス重視の場合はMyISAMにしましょう、ということですかね。

テーブルごとに、ストレージエンジンを選択することもできます。

phpMyAdminでMySQLのストレージエンジンを変更する

Multiple dex files define Landroid/support/annotation/AnimRes

Ajax
Android Studio1.3.1

EclipseからAndroid Studioに移行中です。
数々の困難がありましたが、ようやく、Runできそうなところまで来ました!

しかし、最後にRunすると、次のようなエラーが出ます。

 :compileDebugNdk UP-TO-DATE
 :compileDebugSources
 :preDexDebug
 :dexDebug
 AGPBI: {"kind":"simple","text":"UNEXPECTED TOP-LEVEL EXCEPTION:","sources":[{}]}
 AGPBI: {"kind":"simple","text":"com.android.dex.DexException: Multiple dex files define Landroid/support/annotation/AnimRes;","sources":[{}]}
 AGPBI: {"kind":"simple","text":"\tat com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)","sources":[{}]}
 AGPBI: {"kind":"simple","text":"\tat com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)","sources":[{}]}
 AGPBI: {"kind":"simple","text":"\tat com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)","sources":[{}]}
 AGPBI: {"kind":"simple","text":"\tat com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)","sources":[{}]}
 AGPBI: {"kind":"simple","text":"\tat com.android.dx.merge.DexMerger.merge(DexMerger.java:189)","sources":[{}]}
 AGPBI: {"kind":"simple","text":"\tat com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)","sources":[{}]}
 AGPBI: {"kind":"simple","text":"\tat com.android.dx.command.dexer.Main.runMonoDex(Main.java:302)","sources":[{}]}
 AGPBI: {"kind":"simple","text":"\tat com.android.dx.command.dexer.Main.run(Main.java:245)","sources":[{}]}
 AGPBI: {"kind":"simple","text":"\tat com.android.dx.command.dexer.Main.main(Main.java:214)","sources":[{}]}
 AGPBI: {"kind":"simple","text":"\tat com.android.dx.command.Main.main(Main.java:106)","sources":[{}]}
 
 FAILED
 
 FAILURE: Build failed with an exception.
 
 * What went wrong:
 Execution failed for task ':dexDebug'.
 > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: 
 Process 'command 'C:\Program Files\Java\jdk1.7.0_79\bin\java.exe'' fini shed with non-zero exit value 2
 
 * Try:
 Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
 
 BUILD FAILED
 
 Total time: 33.514 secs

下記に参考情報が書いてありまして、

http://stackoverflow.com/questions/26342444/multiple-dex-files-define-landroid-support-annotation-animres

libs/android-support-v4.jar

を削除したら治りました!

Movable Typeメール送信時のエラー

Movable Type

Movable Typeにてメール送信機能を使用しようとすると、下記のようなエラーが出てメールが送信できない場合があります。

 Movable Type
 エラーが発生しました。
 close SMTPでメールを送信するにはMail::Sendmailをインストールする必要があります: 
 Can't locate Mail/Sendmail.pm in @INC
 (@INC contains: /usr/home/**/****…) 続く

これを解決するためには、次の方法があります。

  1. Sendmail.pmを下記のCPANのサイトからダウンロードします。

This releaseの右のDownloadというリンクをクリックしてください。

http://search.cpan.org/~mivkovic/Mail-Sendmail-0.79/

  1. Movable Typeの/extlib というディレクトリに /Mail というディレクトリを作成します。
  2. 先ほどのサイトからダウンロードした圧縮ファイルを解凍して、含まれているSendmail.pm を、さっき作成した/extlib/Mail に移します。

Movable Type導入支援・カスタマイズ・構築

Movable Type 同じ階層にあるほかのサブカテゴリを表示

Movable Type
Movable Type アーカイブテンプレート

Movable Type ひとつ上の階層のサブカテゴリを表示する

Movable Type 4

Movable Type カテゴリー・アーカイブでサブカテゴリを表示するでカテゴリアーカイブテンプレートを変更したら、もうちょっと踏み込んでみます。
すべてのカテゴリにサブカテゴリがあればいいですが、そうでない場合ももちろんあります。最下層のカテゴリなどはそうですよね。
そういう場合、ただの空白ではなくて、そのカテゴリから見て同じ階層にあるカテゴリ(ひとつ上の階層のサブカテゴリ)たちを並べる、という手があります。
同じカテゴリアーカイブテンプレートを編集します。

例:該当のカテゴリにサブカテゴリがない場合は、同じ階層のカテゴリを表示

 
 <MTHasNoSubCategories>
 <div>
 <MTHasParentCategory>
 <MTParentCategory>
 <MTSubCategories>
 <MTIfNonZero tag="MTCategoryCount">
 <a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>">
 <MTCategoryLabel></a>
 </MTIfNonZero>
 </MTSubCategories>
 </MTParentCategory>
 </MTHasParentCategory>
 </div>
 </MTHasNoSubCategories>

以下解説です。

 <MTHasNoSubCategories> …サブカテゴリがない場合、以下を実行
 <div>
 <MTHasParentCategory> …親のカテゴリがある場合
 <MTParentCategory> …親のカテゴリの
 <MTSubCategories> …サブカテゴリ
 <MTIfNonZero tag="MTCategoryCount"> …があれば
 <a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>">…そのカテゴリへのリンク設定
 <MTCategoryLabel>
 </a>カテゴリ名
 </MTIfNonZero>
 </MTSubCategories>
 </MTParentCategory>
 </MTHasParentCategory> 
 </div>
 </MTHasNoSubCategories>

ただ、これだけだとサブカテゴリがない&親のカテゴリがない場合、つまり1階層目のカテゴリページでは何も表示されません。
ので、次のようにします。

続き→カテゴリ内のエントリーを表示する

Movable Type導入支援・カスタマイズ・構築はこちら

  • 閉じ忘れがありますよ — {2010-09-14 (火) 20:20:26}
  • ご指摘、ありがとうございます!修正しました。 — 中の人 {2010-09-15 (水) 14:21:27}
  • 閉じ忘れがありますよ — {2012-08-14 (火) 11:56:24}
  • 申し訳ありません、もう弊社でMTの環境がないため、ご指摘の箇所がわかりません。お手数でなければ、修正して頂けるか、どの部分か教えて頂けると助かります。m(_ _)m — 中の人 {2012-08-15 (水) 10:53:03}