mysql - 选择查询中的逻辑错误

标签 mysql asp.net

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 秒)

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

最佳答案

仅当您的 select 语句中未选择任何记录时,才应报告“ADDED SUCCESSFULLY”,但考虑到您在 call sp_Getnewtask('2011-05-20','2011-05-29',6 中输入的变量,8,@outmsg); 实际上,您在所有 WHERE 的 OR 条件中触发了 6 个条件中的 4 个。

编辑添加:

我已经运行了以下命令(包括结果)。我所做的是更改变量的名称,这样您就不会得到始终为 true 的 WHERE 语句(SID=SID 或 TID=TID 将始终为 true)。我还更改了 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 或 lit 匹配,则它将找到该记录。找到记录后会报告“记录已存在”

关于mysql - 选择查询中的逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25974917/

相关文章:

asp.net - 如何更改asp :DropDownList extended background color ? CSS类

javascript - 如何运行这个jquery

php - if/else 选择对不存在的数据进行查询

java - 在Java中使用用户名和密码创建数据库

mysql - 将 Redmine 自定义字段值获取到文件

Asp.net 图像随机给出 401 未经授权的错误

php - MySQL 查询 WordPress 日事件

mysql - 使用函数显示图像

html - 如何使字形图标用作提交按钮?

asp.net - 将 css 文件链接到内容页面