mysql:12661
From: Hisamitsu Issei <Hisamitsu Issei <ds1i-hsmt@xxxxxxxxxx>>
Date: Mon, 23 Jan 2006 19:30:25 +0900
Subject: [mysql 12661] 複数の検索結果をつなぎあわせて取得したい
久光と申します MySQL 4.0.24 PHP 4.3.11 のレンタルサーバーを使っています。 下記のようなnumフィールドに特定の数値、listフィール ドに「|」で区切ら れた複数のアイテムが入力されているテーブルがあります(実際にはlist フィールドには1〜40個程度のアイテムが入力されている 2000行程度のテー ブルです)。 --------------------------------------------------------- id name num list --------------------------------------------------------- 1 あ 6 |リンゴ|みかん|メロン|ス イカ|イチゴ|カキ| 2 い 3 |リンゴ|メロン|カキ| 3 う 5 |みかん|メロン|リンゴ|イ チゴ|カキ| 4 え 6 |リンゴ|みかん|メロン|ス イカ|イチゴ|カキ| 5 お 3 |スイカ|イチゴ|カキ| 6 か 4 |みかん|メロン|スイカ|カキ| ・・・・・・(2000行くらい) --------------------------------------------------------- このテーブルに対して SELECT id, num FROM `prod` WHERE `list` like '%|リンゴ|%' SELECT id, num FROM `prod` WHERE `list` like '%|イチゴ|%' をそれぞれ実行した場合(実際には状況によって数十個のSELECT 文を必要と する場合があります)、全ての検索結果を単純につなげているだけの下 記の ようなidがダブった状態の結果として取得し、 --------- id num --------- 1 6 2 3 3 5 4 6 6 4 1 6 3 5 4 6 5 3 --------- これを最終的にはidごとにnum値を合計して、合計値が大 きい順に並べ直して --------- id SUM --------- 1 12 4 12 3 10 2 3 6 4 5 3 --------- ↑このような結果を取得したいのです。もちろん途中の結果なしにいき なり 最後の結果が取得できればそれにこしたことはないのですが。 おそらく途中までMySQLで実行して最後はPHPの配列関数を 使って整理するの が無難だろうと思い (SELECT id, num FROM `prod` WHERE `list` like '%|リンゴ|%') UNION (SELECT id, num FROM `prod` WHERE `list` like '%|イチゴ|%') UNION・・・・・・ のような数十個のSELECT文をUNIONでつないだ検索式を実 行したところ、id がダブらないように整理された結果が出力されてしまいました (WHEREをOR でつないだ場合と同じ結果)。結局、PHPの繰り返し関数を使って 1)SELECT id, num FROM テーブル名 WHERE `list` like '%|変数| %'を実行 2)結果をPHPでidをキーにした連想配列に格納(初出 idなら追加、作成済み なら加算) を延々と繰り返して、最後にPHPの配列を降順にするというスク リプトを組 みました。これで目的とする結果は出力できたのですが、これだと場合 によっ ては一度に40回近いSELECT文をMySQLに処理させる ことになるので、応答が 遅くなったりレンタルサーバーに余計な負荷をかけてるのではないかと 感じ ています。もっと効率的なやり方があるのではないかと思うのですが、 なにか よい方法はないでしょうか。よろしくお願いします。 追加 今はnum値の合計を求める方法でスクリプトを組んでいますが、 idごとに 検索ヒット回数を求めて「ヒット回数の合計×num値」によって も同じ結果 を取得できます。この線で組み直すと効率的な方法が見つかるかも、と 思っ たのですが頭が混乱して途中で断念しています。 ================================= == HISAMITSU ISSEI == == DS1I-HSMT@xxxxxxxxxx == http://www.ne.jp/asahi/pro/his/ =================================
-> 12661 2006-01-23 19:30 [Hisamitsu Issei <ds1] 複数の検索結果をつなぎあわせて取得したい 12662 2006-01-23 20:32 ┗[UNO Shintaro <uno@xx] 12663 2006-01-24 02:06 ┗[Hisamitsu Issei <ds1] 12664 2006-01-24 07:57 ┗[UNO Shintaro <uno@xx]