0

私のクラスに渡される未知の変数の配列 (php 内) から mysql ステートメントを構築しようとしています。問題は、ステートメントを作成すること自体ではなく (私には可能です)、より優れた、より効率的なステートメントを作成することです。

以下の表を単純化して、主要な属性のみを示しています。

1 つのマスター テーブル (ジョブ) を取得しました

仕事

jid, j_ref

次に、これはすべてのジョブ プロパティを保持する 2 番目のテーブルにリンクします

Job_properties

jpid,jid,j_arg,j_value

サンプルデータ:

仕事

jid: 1
j_ref: AB12345

Job_properties

jpid: 1, jid: 1, j_arg: address_1, j_value: 123 somewhere street
jpid: 2, jid: 1, j_arg: address_2, j_value: some lovely town
jpid: 3, jid: 1, j_arg: salary, j_value: 50000
jpid: 4, jid: 1, j_arg: job_type, j_value: permanent
....

したがって、ジョブ 1 (jid=1) には、これら 4 つのプロパティがあります (jpid は、一意の自動インクリメント ID です)。

検索が入ってきたら、job_properties に基づいて検索したいと思います。もちろん、検索にはプロパティの一部および/または任意のものを含めることができます。私はクエリから返されたjidのみを受け取りたいです(明らかに一意であるため、同じjidの4つではありません)。

私が現在この問題をコーディングする方法はIN、次のようなものを生成する複数の句を持つことです。

select j.jid from job j where
jid in (select jid from job_properties where j_arg='salary' and j_value > '40000')
and
jid in (select jid from job_properties where j_arg='address_2' and j_value='some lovely town') ... (insert more IN clauses for each value that is passed to the search)

渡された配列内の各変数をループしIN、where ステートメントに別の句を追加します。

しかし、これは非常に非効率的で、大量の検索を受け取るようになると、速度が大幅に低下します (1 つのジョブに 20 ~ 30 のプロパティを含めることができます)。

おそらくHAVINGとgroup byを使用して、これを行うより良い方法はありますか?

これは、この質問に似ています: Select mysql data with where clause in 2 tablesですが、プロパティだけでなく、他のテーブルの引数もクエリする必要があります。

前もって感謝します

ニック

PS 明らかに結果は検索時のデータベース内のジョブに依存しており、これは 1 時間ごとに変化するため、結果をキャッシュすることはできず、作成時のオーバーヘッドについて心配する必要はありません。

4

1 に答える 1