我正在编写一个查询来从名为contracts
的表中获取数据,并加入表user_data
或teams
。表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
我如何使用查询执行此任务,并根据另一个表中的值从表中获取数据?
答案 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
中选择数据,然后发出单独的语句以从用户或团队表中获取日期。