MySQL设计;使用变量查看或存储过程

时间:2012-11-05 07:53:57

标签: mysql sql stored-procedures view sql-view

我要执行一个复杂的查询,从7-8个表中选择几个列。

我们不想用编程语言编写该查询(在我们的例子中是PHP - Symfony 1.4 / Propel 1.4),而是创建一个视图或存储过程,以便为开发人员提供非常简单的选择查询。我很困惑什么是更好的方法。

我们需要采用以下格式进行查询:

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或视图和简单的选择查询)

2 个答案:

答案 0 :(得分: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*/

答案 1 :(得分: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;