2011-07-13 26 views
2

3番目の選択(サブクエリ)テーブルの1番目の選択テーブルからフィールドを参照しようとしています。 ただし、クエリのサブレベルに移動すると、そのフィールドは認識されません。 私が取り組んでいるPHPコードは、SQLを使用して、他の場所で使用されるSQLコマンド(文字列)の一部を返します。外部クエリ/サブクエリを参照する最も良い方法は?

この例では、ネストされたクエリの解決方法を示しています。私は、私が選択し第三のレベルを避けることができると思い、少しの作業

tables -----------> fields 
table_users  -> [user_id, name, email, rank, ...] 
table_users_jobs -> [user_id, job_id, period, ....] 
table_jobs  -> [job_id, status, rank, ...] 


-- sql calling code -> $rank = "t1.rank"; get_users_info_by_rank($rank); 
-- maybe using: SET @rank = NULL; SELECT @rank := $rank, t1.name, ... 
    SELECT t1.name, t1.email 
    FROM table_users as t1 
    WHERE t1.user_id IN (
     SELECT t2.user_id 
     FROM table_users_jobs as t2 
     WHERE t2.period = 'night' AND 
     t2.job_id IN (
--   avaiable jobs to that rank -> get_job_ranks_sql($rank); 
      SELECT t3.job_id 
      FROM table_jobs as t3 
--   maybe using: t3.rank = @rank 
      WHERE t3.rank = t1.rank AND 
      t3.status = 'avaiable_position') 
     ) 

:ここで 私は名前と夜間の作業と一致するジョブ可能なジョブのランクを持っているユーザーの電子メールを取得しようとしています問題。

でも、私は多分にそれは一般的な作成しようとしているPHPを使用して
function get_job_ranks_sql($rank){ 
    //probably 't3' will be renamed for something more unique 
    return 'SELECT t3.job_id 
      FROM table_jobs as t3 
      WHERE t3.rank = '.$rank.' AND 
      t3.status = "available_position")'; 
    } 

:それでもポイントは、私は私に私が選んだランクのJOB_IDを与える関数のような再利用SQLコードにしようとしているということです可能であれば、別の言語で使用してください。使用 SQLバージョンは、MySQL 5.1.41で実際に私はそれがSQL変数 @rankなどを使用することによって、私が望むように可能だと思うが、私はそれが遅くなるかどうか分からないと

より良い他がある場合方法はです。 1つのコメンターが指摘したように任意の助けを事前に

感謝:)

+0

インラインビュー(ネストされたselect文)を使用する理由はありますか?あなたは結合ですべてこれを行うことができます... – Nate

+0

これは単なる例にすぎません。通常、それはずっと複雑で、最終的なSQLは、私がそこにputしたget_job_ranks_sqlのような中間にSQLを返すいくつかの関数を連結することによって形成されます。 – Seeker

答えて

1

だから、私はあなたがサブ選択よりも、JOINS使用してオフはるかに良いと思います。例えば、私が正しくあなたのクエリ/問題を読んでいた場合、あなたはこのような結合問合せ行うことができます。より多くの読みやすく、簡潔で

SELECT t1.name, t1.email, t3.job_id 
FROM table_users t1 
LEFT JOIN table_users_job t2 
ON t1.user_id = t2.user_id 
LEFT JOIN table_jobs t3 
ON t3.job_id = t2.job_id 
WHERE t2.period = 'night 
AND t3.status = 'available_position' 

を、そしてあなたのデータベースに簡単です。しかし、これを行うと、SQLをモジュール化できなくなります。それが本当に重要な場合は、そのようなクエリをストアドプロシージャに格納することを検討することもできます。このようにして、SPの結果リストを返すことができます。もちろん

http://www.wellho.net/resources/ex.php4?item=s163/stp4

、実際に選択したサブの低いレベルで変数にアクセスすることができるというあなたの問題を解決していませんが、それはへのあなたのSQLをより容易になります。このチュートリアルを見てみましょう管理し、他の言語の実装で利用できるようにすることができます。

大規模な画像では、ORMレイヤーを提供するPHPフレームワークに移行し、それらのテーブルをオブジェクトにして、データをより簡単かつ柔軟にアクセスできるようになります(通常)。しかし、それは非常に「大きな写真」であり、プロジェクトの要件には適していない可能性があります。しかし私が推薦できるフレームワークの1つは、CakePHPです。

+0

SQLをモジュール化することが私の優先事項です。 PHPの私のコードの一部は、他の関数などで使用されるようにSQLを返す関数を使用してモジュール内にすでにありました。しかし、私は 't1のようなSQL文を渡していました。一部のサブ関数で失敗した関数引数の 'rank1'のような直接値の代わりに 'rank'を使用します。私はSQL変数(@rank)を使用しようとしましたが、それはうまくいくようですが、私が正しく実装できるかどうか、そしてより良い方法があるかどうかはわかりません。 Tyは、モジュール化SQLへのリンクについては、後でそれをチェックします。 – Seeker

+1

その場合、私はストアドプロシージャの大量使用を間違いなく推奨します。多くの人々は、彼らを好きではなく、他の人はSPでシステム全体を構築します。あなたのケースでは、もっと簡単なSPを使ってアプリケーションが呼び出すより複雑なものを構築することを主張することさえ可能です。ところで、そのリンクはSPから結果リストを得ることができるという事実を実際に示すだけです。実際にSPベースのシステムを使用するという完全なゲシュタルトには入っていません。あなたがSPを見て、DB上で重くなりたくないのであれば、フレームワークへのアップグレードを見て、たくさんのコードを作る必要がなくなります。 – user470714

関連する問題