[前][次][番号順一覧][スレッド一覧]

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]