私のクラスに渡される未知の変数の配列 (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 時間ごとに変化するため、結果をキャッシュすることはできず、作成時のオーバーヘッドについて心配する必要はありません。