如何在表中存在时从表中进行选择

时间:2011-09-12 10:37:02

标签: php mysql sql

当一个讲座(“讲座”表中的一行)被删除时,它将被移动到“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'];
    } 

5 个答案:

答案 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 = 0WHERE is_deleted = 1,以获取已删除或未删除的讲座(或省略WHERE子句以获取两者)。

如果你想在当前的数据模型中解决它,我会在2个查询中完成。我认为mysql_query不会支持您当前的SQL语句。因此,首先查询lectures表,如果结果为零,请在lectures_deleted中检查它是否存在。

此外,我不知道您的$id变量的确切位置,但您可能希望确保您的查询不容易受到SQL injections的攻击。<​​/ p>