当一个讲座(“讲座”表中的一行)被删除时,它将被移动到“lectures_deleted”表中。这可以作为一种备份。在这种情况下,我需要能够从这两个表中调用,所以我想从'讲座'表中获取数据,但如果它在这里不存在,那么我想从而获取它'lectures_deleted'表。
以下代码目前打破了网站。任何帮助将不胜感激!
function getModuleCode($id){
$result = mysql_query('
IF EXISTS
(SELECT * FROM lectures WHERE lecture_id="'.$id.'")
ELSE
SELECT * FROM lectures_deleted WHERE lecture_id="'.$id.'";
')
or die(mysql_error());
$row = mysql_fetch_array($result);
return $row['module_code'];
}
答案 0 :(得分:2)
怎么样:
$result = mysql_query('
(SELECT * FROM lectures WHERE lecture_id="'.$id.'")
UNION
(SELECT * FROM lectures_deleted WHERE lecture_id="'.$id.'");
')
这种方式也会从lectures_deleted中选择,如果它仍然存在于讲座表中,但根据你的描述,我相信这不应该发生。
或者,我建议在讲座表中使用“删除”标志(一位字段),指示是否已删除讲座。这样您就不需要将已删除的条目移动到另一个表。
答案 1 :(得分:1)
SELECT 1 AS pref, * FROM lectures WHERE lecture_id="'.$id.'"
UNION
SELECT 2 AS pref, * FROM lectures_deleted WHERE lecture_id="'.$id."'
ORDER BY pref
LIMIT 0,1
答案 2 :(得分:0)
您当前的查询是错误的,因为如果lectures
中存在讲座,您不会返回任何内容,因此您需要像这样修改它:
IF EXISTS (SELECT * FROM lectures WHERE lecture_id="'.$id.'")
SELECT * FROM lectures WHERE lecture_id="'.$id.'"
ELSE
SELECT * FROM lectures_deleted WHERE lecture_id="'.$id.'";
但是,在性能方面,最好在您的情况下使用Union
- 运算符,因为它只会执行一次选择(假设两个表中的所有列都相同并且顺序相同):
select * from lectures where lecture_id=$id
union
select * from lectures_deleted where lecture_id=$id
答案 3 :(得分:0)
IF ... ELSE决策语句不能用于直接MySQL查询。它只能用于功能/存储过程 你可以试试这个
$result = mysql_query(SELECT * FROM lectures WHERE lecture_id="'.$id.'")
if (mysql_num_rows($result) == 0)
$result = mysql_query(SELECT * FROM lectures_deleted WHERE lecture_id="'.$id.'")
答案 4 :(得分:-1)
我知道这不是您问题的准确答案,但为什么不在您的is_deleted
表中更改您的数据模型,使其具有名为lectures
的列,值为0或1?这样,您就不需要将已删除的讲座存储在单独的表中。您只需要在查询中包含一个WHERE子句,如WHERE is_deleted = 0
或WHERE is_deleted = 1
,以获取已删除或未删除的讲座(或省略WHERE子句以获取两者)。
如果你想在当前的数据模型中解决它,我会在2个查询中完成。我认为mysql_query
不会支持您当前的SQL语句。因此,首先查询lectures
表,如果结果为零,请在lectures_deleted
中检查它是否存在。
此外,我不知道您的$id
变量的确切位置,但您可能希望确保您的查询不容易受到SQL injections的攻击。</ p>