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