[groonga-dev,02480] Re: 「GROUP BY」条件をmroonga_command()で再現する方法

Back to archive index

Kimura A a.kim****@live*****
2014年 7月 8日 (火) 14:45:58 JST


木村です。須藤さんどうもありがとうございます。

> であれば、nameとkanaを合わせてプライマリーキーにするのがよい
> と思います!

なんとそんな手が…。GroongaというよりMySQLの話になってくるようですね。
複数カラムでプライマリーキーを作るのも初めての経験です。おかげさまで勉強になりっ放しです(~△~;)

> select t
> --limit 0
> --drilldown name_kana
> --drilldown_limit 10
> --drilldown_output_columns name,kana,_nsubrecs
> --drilldown_sortby kana

これでほぼ思うようなデータが取れることを確認しました。
ただ取得されるレコードの中に、以下のような「name_kanas.kana値が空のレコード」が含まれてしまいますね。

トム, , 1            // ←この行
ジェリー, じぇりー, 1
十夢, じゅうむ, 1
…

なので、あとは素のMySQLクエリの中の

>> WHERE t.kana IS NOT NULL

というWHERE句をどう再現するか、という問題だけだと思います。
将来的に、kana値が「あ」で始まるものだけを取得、などといった応用も考えられるので、ここはぜひとも抑えておきたいところです。

このくらいは自力でなんとかしたいと思って、とりあえず「--query kana:!""」とやってみたんですが、
General error: 1026 column lookup failed
というエラーになってしまいました。
MySQL風にテーブル名を追加して「--query name_kanas.kana:!""」と書いてみても同様です。
また、「t.name_kanaが"/"で終わらない」という条件に読み替えて、「--query name_kana:!$/」というのも試してみたんですが、どうも後方「不一致」検索にはならないようで、0件取得になってしまいました。

どうすれば「WHERE t.kana IS NOT NULL」に相当する条件を追加できるでしょうか?
長らくお付き合いいただいていて恐縮の至りですが、参考URLだけでも教えていただければ幸いです。
僕も引き続き自助努力します…結果が出た場合は追ってご報告しますm(_ _;)m




----------------------------------------
> Date: Thu, 3 Jul 2014 21:43:23 +0900
> To: groon****@lists*****
> From: kou****@clear*****
> Subject: [groonga-dev,02469] Re: 「GROUP BY」条件をmroonga_command()で再現する方法
>
> 須藤です。
>
> In <BAY17****@phx*****>
> "[groonga-dev,02453] Re: 「GROUP BY」条件をmroonga_command()で再現する方法" on Fri, 27 Jun 2014 20:28:29 +0900,
> Kimura A <a.kim****@live*****> wrote:
>
>> ご提案いただいたテーブル構成で、実際に動作確認もできました。ありがとうございます。
>> ベクターカラムと似たコメントを書くことでJOINできる、ということ自体が僕にとっては初耳だったので、たいへん勉強になりました。
>
> よかったです!
>
>> ただ、実は1つ、こちらのご説明に手抜かりがありました。
>> 情報の後出しになってしまって大変申しわけないんですが、ご指摘の「表記(name)は同じだが読み方(kana)が違う」レコードの存在は、今回、想定のうちに入れておきたいんですよね…。
>> 要件が変わってしまってすみませんm(_ _;)m
>
> であれば、nameとkanaを合わせてプライマリーキーにするのがよい
> と思います!
>
> MySQLの場合は複数カラムでプライマリーキーを作れますが、
> Groongaはサポートしていないので、新しくカラムを作って、そこ
> に自分でプライマリーキーを設定してください。
>
>> CREATE TABLE t (
>>   id int primary key auto_increment,
>>   name varchar(255),
>>   kana varchar(255)
>> ) ENGINE = Mroonga DEFAULT CHARSET = utf8;
>
> これを
>
> CREATE TABLE name_kanas (
> name_kana varchar(512) PRIMARY KEY,
> name varchar(255),
> kana varchar(255)
> ) ENGINE = Mroonga DEFAULT CHARSET = utf8;
>
> CREATE TABLE t (
> id int primary key auto_increment,
> name_kana varchar(255) COMMENT 'type "name_kanas"'
> ) ENGINE = Mroonga DEFAULT CHARSET = utf8;
>
> みたいにして、
>
>> たとえば、tテーブルに以下のようなレコードがあった場合、
>>
>> INSERT INTO t (name, kana) VALUES ("トム", "とむ");
>> INSERT INTO t (name, kana) VALUES ("ジェリー", "じぇりー");
>> INSERT INTO t (name, kana) VALUES ("十夢", "とむ");
>> INSERT INTO t (name, kana) VALUES ("ミッキー", "みっきー");
>> INSERT INTO t (name, kana) VALUES ("トム", "とむ");
>> INSERT INTO t (name, kana) VALUES ("十夢", "じゅうむ");    // ※この行以降を追加しました
>> INSERT INTO t (name, kana) VALUES ("トム", null);
>
> レコードはこうします。
>
> INSERT INTO name_kanas (name_kana, name, kana) VALUES ("トム/とむ", "トム", "とむ");
> INSERT INTO name_kanas (name_kana, name, kana) VALUES ("ジェリー/じぇりー", "ジェリー", "じぇりー");
> INSERT INTO name_kanas (name_kana, name, kana) VALUES ("十夢/とむ", "十夢", "とむ");
> INSERT INTO name_kanas (name_kana, name, kana) VALUES ("ミッキー/みっきー", "ミッキー", "みっきー");
> INSERT INTO name_kanas (name_kana, name, kana) VALUES ("十夢/じゅうむ", "十夢", "じゅうむ");
> INSERT INTO name_kanas (name_kana, name, kana) VALUES ("トム/", "トム", null);
>
> INSERT INTO t (name_kana) VALUES ("トム/とむ");
> INSERT INTO t (name_kana) VALUES ("ジェリー/じぇりー");
> INSERT INTO t (name_kana) VALUES ("十夢/とむ");
> INSERT INTO t (name_kana) VALUES ("ミッキー/みっきー");
> INSERT INTO t (name_kana) VALUES ("トム/とむ");
> INSERT INTO t (name_kana) VALUES ("十夢/じゅうむ");
> INSERT INTO t (name_kana) VALUES ("トム/");
>
> 区切り文字(↑だと「/」)はname,kanaにでてこない文字ならなん
> でもいいです。
>
>> 欲しいのは以下のような結果です。
>>
>> ジェリー, じぇりー, 1
>> 十夢, じゅうむ, 1
>> トム, とむ, 2
>> 十夢, とむ, 1
>> ミッキー, みっきー, 1
>>
>> これをmroonga_command()で実現するにはどうすればよいでしょうか?
>
> で、こうです。
>
> SELECT mroonga_command("select t --limit 0 --drilldown name_kana --drilldown_limit 10 --drilldown_output_columns name,kana,_nsubrecs --drilldown_sortby kana") AS result;
>
> 整形するとこうです。
>
> select t
> --limit 0
> --drilldown name_kana
> --drilldown_limit 10
> --drilldown_output_columns name,kana,_nsubrecs
> --drilldown_sortby kana
>
> ということで、nameとkanaをあわせてキーにしてください!が回答
> になります!
>
> --
> 須藤 功平 <kou****@clear*****>
> 株式会社クリアコード <http://www.clear-code.com/>
>
> Groongaサポート:
> http://groonga.org/ja/support/
> パッチ採用:
> http://www.clear-code.com/recruitment/
> コードリーダー育成支援:
> http://www.clear-code.com/services/code-reader/
>
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
 		 	   		  



groonga-dev メーリングリストの案内
Back to archive index