0

7〜8個のテーブルからいくつかの列を選択して、複雑なクエリを実行する必要があります。

そのクエリをプログラミング言語(この場合はPHP-Symfony 1.4 / Propel 1.4)で記述したくはありませんが、開発者向けの非常に単純なselectクエリを持つビューまたはストアドプロシージャを作成します。何がより良いアプローチになるのか混乱しています。

次の形式のクエリが必要です。

SET @PlayerId = 1;

SELECT CASE WHEN mat.player1id = @PlayerId THEN mat.player2id ELSE mat.player1id END as opponent
    /*plus many other columns*/
FROM `wzo_matches` as mat /*plus few other tables*/
WHERE (mat.player1id =@PlayerId OR mat.player2id=@PlayerId)
    /*plus other join conditions*/

ビューの問題は、SET @PlayerId=xxステートメントです。事前にプレーヤーIDはわかりませんが、PHPを介して渡されます。これが見解を除外する理由であることを願っています。そのための回避策はありますか?

その他のオプションはストアドプロシージャになります。それに関する唯一の問題は、クエリごとに新しいビューが作成されるため、DBの操作が非常に重くなることです。

開発者がPHPで上記の複雑なクエリを記述せずに、上記のクエリから必要なデータを取得できるように、誰かが最善のアプローチを提案できますか?(明らかに、SPまたはビューとそこからの単純な選択クエリを介して)

4

2 に答える 2

0
CREATE PROCEDURE SELECT_PLAYER(p INT) SET @PlayerId  = p
SELECT CASE WHEN mat.player1id = @PlayerId THEN mat.player2id ELSE mat.player1id END as opponent
    /*plus many other columns*/
FROM `wzo_matches` as mat /*plus few other tables*/
WHERE (mat.player1id =@PlayerId OR mat.player2id=@PlayerId)
    /*plus other join conditions*/
于 2012-11-05T08:01:40.100 に答える
0

Can I create view with parameter in MySQL?の返信に基づく 、私の問題は次のクエリで修正されました:

create function getPlayer() returns INTEGER DETERMINISTIC NO SQL return @getPlayer;

create view getPlay as
    SELECT
        CASE WHEN play.hiderid = getPlayer() THEN play.seekerid ELSE play.hiderid END AS opponent, play . * 
        FROM odd_play play, odd_match mat
        WHERE (seekerid = getPlayer() OR hiderid = getPlayer())
        AND play.id = mat.latestplay;

select play.*
from (select @getPlayer:=1 p) ply, getPlay play;
于 2012-11-05T08:53:03.680 に答える