Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL-Case/If语句_Php_Mysql - Fatal编程技术网

Php MySQL-Case/If语句

Php MySQL-Case/If语句,php,mysql,Php,Mysql,我正在编写一个查询,以从名为contracts的表中获取数据,并将其连接到表user\u data或teams。表contracts中有一列名为contracteeType,我想在其中用作参数的条件变量。在PHP代码中,这将按照以下方式进行: if ($contracteeType === 'user') { // SELECT data FROM user_data table } else { // SELECT data FROM teams table } 我已经尝试过研究这个

我正在编写一个查询,以从名为
contracts
的表中获取数据,并将其连接到表
user\u data
teams
。表
contracts
中有一列名为
contracteeType
,我想在其中用作参数的条件变量。在PHP代码中,这将按照以下方式进行:

if ($contracteeType === 'user') {
  // SELECT data FROM user_data table
} else {
  // SELECT data FROM teams table
}
我已经尝试过研究这个问题,我发现了一个解决这个问题的案例说明,但它似乎在我的服务器上不起作用。以下是我的想法:

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
如何使用查询执行此任务,并根据另一个表的值从表中提取数据?

我看到“如果”对您有效的唯一方法是使用存储过程。我发现您的问题有点令人困惑,但我相信您可以通过创建和调用存储过程来解决它

这种方法有一些缺点(代码很多,不同于简单的查询),但是它有很多优点(安全、预编译的速度快,对于“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; //

只有小剂量的愈合才有效。计算结果集需要临时表,这些临时表将很快耗尽内存分配,如果需要对一个表进行排序,则不可能使用索引。此外,如果表具有不同的模式,则列名将被提升

在这种情况下,我会尝试以下方法:

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
但是,通过重新评估您的数据库模式,通常可以更好地解决此类不可靠的查询


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

您是否检查了mysql错误日志?您的语法有错误。这种问题可能表明设计不好。不,您不能在查询上选择条件表等等。如果需要,则需要使用带有动态表名的prepare语句的存储过程。是。存在错误,这些错误最初表示为
无法识别的关键字(靠近“case”)
。之后的所有错误都是由于大小写语法有点不正确。。。