MySQL - Case / If语句

时间:2016-05-25 18:04:26

标签: php mysql

我正在编写一个查询来从名为contracts的表中获取数据,并加入表user_datateams。表contracts中有一列名为contracteeType的列,其中我想将其用作参数的条件变量。在PHP代码术语中,这将按以下方式完成:

if ($contracteeType === 'user') {
  // SELECT data FROM user_data table
} else {
  // SELECT data FROM teams table
}

我已经尝试过对此进行研究,并且我遇到了CASE语句解决方案,但它似乎并没有在我的服务器上运行。以下是我的想法:

SELECT * 
FROM contracts 
CASE 
    WHEN contracts.contracteeType = 'user' 
    THEN 'user_data' 
    WHEN contracts.contracteeType = 'team' 
    THEN 'teams' 
END as tableName 
CASE 
    WHEN contracts.contracteeType = 'user' 
    THEN 'userID' 
    WHEN contracts.contracteeType = 'team' 
    THEN 'teamID' 
END as colName 
INNER JOIN tableName 
ON tableName.colName = '.$contractID

我如何使用查询执行此任务,并根据另一个表中的值从表中获取数据?

2 个答案:

答案 0 :(得分:1)

我能看到“if”为您工作的唯一方法是使用存储过程。我发现你的问题有点混乱,但我确信你可以通过制作和调用存储过程来解决它。

这种方法有一些缺点(许多代码,不同于简单的查询)但是它有许多优点(安全,快速,如预编译和无限灵活的“PHP”类型逻辑)。

这是一个示例存储过程...

DELIMITER //

DROP PROCEDURE IF EXISTS MyProcedure; // 
CREATE PROCEDURE MyProcedure()
BEGIN

SET @MyVarA = (SELECT cola FROM tablea);
SET @MyVarB = (SELECT colb FROM tableb);

IF @MyVarA = 'a' AND @MyVarB = 'b' THEN 
    SELECT A FROM B;
END IF

IF @MyVarA = 'd' AND @MyVarB = 'e' THEN 
    SELECT D FROM E;
END IF

END; //

答案 1 :(得分:1)

UNIONs的剂量很小。计算结果集需要临时表,这些表会快速通过内存分配,如果你需要排序一个,那么就没有可能的索引。此外,如果表格具有不同的模式,您的列名将会被抬高。

在这种情况下,我会尝试类似:

SELECT *
FROM contracts c
  LEFT JOIN user_data u
  ON c.type = 'user' AND c.user_id = u.id
  LEFT JOIN team_data t
  ON c.type = 'team' AND c.team_id = t.id
WHERE c.contract_id = :contract_id

但是,通过重新评估数据库架构,通常可以更好地解决这样的问题。

或者,只需先从contracts中选择数据,然后发出单独的语句以从用户或团队表中获取日期。