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

Back to archive index

Kimura A a.kim****@live*****
2014年 6月 27日 (金) 20:28:29 JST


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


> これだと、グループ化したうち、どのレコードのkanaの値を
> 使うの?問題が発生するのでスジがよくなかったです。

たしかに、MySQLのゆるい仕様に依存していた部分がありました。
ご提案いただいたテーブル構成で、実際に動作確認もできました。ありがとうございます。
ベクターカラムと似たコメントを書くことでJOINできる、ということ自体が僕にとっては初耳だったので、たいへん勉強になりました。

ただ、実は1つ、こちらのご説明に手抜かりがありました。
情報の後出しになってしまって大変申しわけないんですが、ご指摘の「表記(name)は同じだが読み方(kana)が違う」レコードの存在は、今回、想定のうちに入れておきたいんですよね…。
要件が変わってしまってすみませんm(_ _;)m


つまり、素のMySQLでいうと、以下のようなグループ化と並び替えを実現したい、ということになります。

CREATE TABLE t (
  id int primary key auto_increment,
  name varchar(255),
  kana varchar(255)
) ENGINE = Mroonga DEFAULT CHARSET = utf8;

SELECT *, count(id) AS c
  FROM t
  WHERE t.kana IS NOT NULL
  GROUP BY kana, name
  ORDER BY kana ASC
  LIMIT 10;

前回からの変更点は、
○SELECTのGROUP BY条件を「name」から「name, kana」に変更
○WHERE条件を追加(※実働環境での要件に近づけるため)
の2つです。


たとえば、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);

欲しいのは以下のような結果です。

ジェリー, じぇりー, 1
十夢, じゅうむ, 1
トム, とむ, 2
十夢, とむ, 1
ミッキー, みっきー, 1

これをmroonga_command()で実現するにはどうすればよいでしょうか?
自分でも、ご提案いただいたテーブル構成をもとに、names.idカラムを追加してPRIMARYキーにしたり、新たにkanasテーブルを追加したりとあれこれ試してみたのですが、ちゃんと動く構成を見つけることができませんでした…。


引き続きアドバイスいただければ幸いです。
どうぞよろしくお願いしますm(_ _)m 		 	   		  



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