【问题标题】:LOGICAL ERROR IN SELECT QUERY选择查询中的逻辑错误
【发布时间】:2014-09-22 13:06:35
【问题描述】:
mysql> Create Procedure sp_Getnewtask(IN sdate datetime, IN edate datetime,IN sid   int,IN tid int,OUT outmsg varchar(50))
-> begin
-> if not exists(
-> SELECT * FROM tbltask WHERE (startdate BETWEEN sdate AND edate)OR (enddate BETWEEN sdate AND edate) OR (sdate BETWEEN startdate AND enddate) OR (edate BETWEEN startdate AND enddate) OR Sid=Sid OR Tid=tid ) then
-> set outmsg = 'ADDED SUCESSFULLY';
-> else
-> set outmsg = 'RECORD ALREADY PRESENT';
-> end if;
-> end $$

mysql> select * from tbltask;

| tblid | startdate           | enddate             | Sid  | Lid  |

|     1 | 2011-05-20 00:00:00 | 2011-05-29 00:00:00 | NULL | NULL |

1 row in set (0.00 sec)

即使数据库中没有记录,它也会显示为记录已存在,

如果我从选择查询中删除 sid,tid 它工作正常, 请提出一些想法以便正确运行输出

当我尝试调用该程序时, 它返回为,

 mysql> call sp_Getnewtask('2011-05-20','2011-05-29',6,8,@outmsg);
-> select @outmsg;
-> $$

查询正常,0 行受影响(0.00 秒)

| @outmsg                |

| RECORD ALREADY PRESENT |

集合中的 1 行(0.00 秒)

但我的实际结果应该是“成功添加”

【问题讨论】:

  • 您在WHERE 条件中使用OR 和Sid=Sid - 这永远是真的!删除OR Sid=Sid OR Tid=tid,它应该可以工作。
  • 但我也想用 sid 和 tid 检查一下。
  • 将您的输入变量重命名为不同于表中的字段名称。所以 inSid 和 inTid。引擎可能无法知道您是否要将变量与字段、字段与字段或变量与变量进行比较。而且我在表中没有看到 TID。我看到了 LID...所以这意味着将 TID 输入与 TID 输入进行比较...这是您想要的吗?
  • 我尝试将tid更改为tutorid,将sid更改为saveid,但我遇到了同样的问题

标签: mysql asp.net


【解决方案1】:

只有在您的选择语句中没有选择任何记录时才应该报告“添加成功”,但如果您在call sp_Getnewtask('2011-05-20','2011-05-29',6,8,@outmsg); 中输入变量,您实际上会在所有 WHERE 的 OR'd 条件中触发您的 6 个条件中的四个。

编辑添加:

我已经运行了以下(包括结果)。我所做的是更改变量的名称,这样您就不会得到始终正确的 WHERE 语句(SID=SID or TID=TID 将始终正确)。我还更改了 SELECT 语句以匹配您作为示例提供的表中的字段名称。

CREATE TABLE tbltask
    (
        tblid int,
        startdate datetime,
        enddate datetime,
        sid int,
        lid int
    );

INSERT INTO `tbltask`(`tblid`, `startdate`, `enddate`) VALUES (1, '2011-05-20 00:00:00','2011-05-29 00:00:00');

DELIMITER //
CREATE Procedure sp_Getnewtask(IN sdate datetime, IN edate datetime,IN inSid int,IN inLid int,OUT outmsg varchar(50))
begin
if not exists
(
    SELECT * FROM tbltask WHERE (startdate BETWEEN sdate AND edate)OR (enddate BETWEEN sdate AND edate) OR (sdate BETWEEN startdate AND enddate) OR (edate BETWEEN startdate AND enddate) OR Sid=inSid OR Lid=inLid
) then
    set outmsg = 'ADDED SUCCESSFULLY';
else
    set outmsg = 'RECORD ALREADY PRESENT';
end if;
end
//

call sp_Getnewtask('2011-05-20','2011-05-29',6,8,@outmsg);
select @outmsg;

RECORD ALREADY PRESENT

call sp_Getnewtask('2010-05-20','2010-05-29',6,8,@outmsg);
select @outmsg;

ADDED SUCCESSFULLY

就目前而言,这似乎正在做它应该做的事情。如果任一日期范围相交,它将找到记录。如果它们不相交但 sid OR lid 匹配,那么它将找到记录。查找记录使其报告“记录已存在”

【讨论】:

  • 当从选择查询中删除 tid 和 sid 时,相同的 OR 条件可以正常工作。
  • 如果您从 WHERE 语句中删除 TID 和 SID,当您执行 call sp_Getnewtask('2011-05-20','2011-05-29',6,8,@outmsg); 时会得到“添加成功”?
  • 是的,我知道,但我需要用 sid 和 tid 来检查我的查询,同样的查询在 MS SQL 中正常工作,但在 MYSQL 中不起作用
  • 没有。我问你是为了澄清“当从选择查询中删除 tid 和 sid 时,相同的 OR 条件可以正常工作。”只需从 WHERE 语句中删除这两个条件,它仍会报告“记录已存在”,但您说删除那些已修复?
  • 是的,它正在工作,因为逻辑工作正常..在添加特定 ID 时,它与我之前的逻辑相关.. 出现问题,我们可以修改查询以检查所有日期、sid 和 tid。 FROM code (startdate BETWEEN sdate AND edate)OR (enddate BETWEEN sdate AND edate) OR (sdate BETWEEN startdate AND enddate) OR (edate BETWEEN startdate AND enddate) 主要问题是添加 SID 和 TID 条件跨度>
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
相关资源
最近更新 更多