【MySQL 4.1】


[table p]
p_id
――
5
8

[table a]
a_id | p_id | text_field
――――――――
1 | 5 | あいうえお
2 | 5 | かきくけこ
3 | 8 | かきくけこ

[table b]
b_id | p_id | text_field
――――――――
1 | 5 | さしすせそ
2 | 8 | たちつてと

====================

table pは、親テーブルで、table aとtable bは子です。

この状態で、
"き"
かつ
"く"
かつ
"す"
かつ
"せ"
が子供のテーブルのtext fieldに含まれるp_idをSELECTしたいと思います。
(考え方が難しいのですが、求める答えは5のみです)

SQL文をお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/05/27 17:43:16
  • 終了:2008/06/03 17:45:02

回答(1件)

id:cicupo No.1

cicupo回答回数13ベストアンサー獲得回数32008/05/28 02:04:21

ポイント60pt

下記のものでいかがでしょうか。

SELECT
  p.p_id
FROM
  p,
  (SELECT p_id, Group_Concat(text_field Separator '') AS text_field
   FROM (SELECT * FROM a UNION SELECT * FROM b) AS temp1
   GROUP BY p_id) AS temp2
WHERE
  p.p_id = temp2.p_id AND
  text_field LIKE '%き%' AND
  text_field LIKE '%く%' AND
  text_field LIKE '%す%' AND
  text_field LIKE '%せ%'
;

この例だとテーブル p を使う必要はないのですが、あえて JOIN しています。実際にはテーブル p には他のカラムが入っていて、それも使いたいと考えられるからです。

(mysql Ver 14.12 Distrib 5.0.51a, for debian-linux-gnu (i486) using readline 5.2)

id:caster777

おお!すごい。

何度考えても出口が見えなかったので、別の方法を考え出していました。

ありがとうございます。

Group_Concatというのを知りませんでした。

早速試してみます。

2008/05/28 10:14:44
  • id:chuken_kenkou
    データ件数はどのくらいあるのでしょうか?

    「列名 LIKE %き%」

    といった中間一致は、インデクスが利用できないので、性能を出したい場合は「やってはいけない」
    操作です。
  • id:cicupo
    えーと、「中間一致は、インデクスが利用できない」というのは注意すべき点だというのはもっともです。ご指摘の通りだと思います。
    今回の場合は、性能に関して言及されてなかったため、特に注意を書きませんでした。
    ついでに言ってしまえば、『性能面を考えるならば』、 UNION も group_concat もベストな解では全然ありません。誤解があればご注意ください。例えば、各条件ごとにビット列を作ってBIT_ANDをとるとかいろんな方法があると思います。ただ、それぞれの制限なり下準備なり、あるように思いますので、今回の方法が一般的には使いやすいのかな、と推測した次第です。

    (ひとりごと:今回のように中間一致させたいときに確立された手法があれば、ついでに教えていただきたかったです。全文検索も方法がいろいろで、いつでも誰にでもオススメなものがあればいいなーと考えています)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません