为什么我的if else没有给出预期的输出? (MySQL的)

时间:2014-09-19 01:12:36

标签: mysql

我希望你们能帮助我使用SQL,因为我是一个新手iN sql。我的问题是,代码没有给出预期的输出,我不知道如何解决这个问题,因为我搜索了书籍和在线资源。我有2个表(customer& order_status)。任务是:

(1) select c_id,lname,address,city,description where c_id > 3
(2) select c_id,lname,address,o_status,item_total,remarks and update description to 'black' where    c_id =3
(3)if item_total > 2, select o_status,item_total. ELse select o_status,item_total,remarks,order_no and update remarks to 'set'

所以,这是代码:

#drop procedure if exists usp_GetAnything;
delimiter //
create procedure usp_GetAnything()
begin
declare total int ;
select total = item_total
from order_status;


select c_id,lname,address,city,description
from customer
where c_id > 3;

select c.c_id,c.lname,c.address,o.o_status,o.item_total,o.remarks,c.description
from customer c,order_status o
where c.c_id=o.c_id;
update customer
set description = 'black'
where c_id = 3;

if (total > 2) then
    select o_status,item_total,remarks
    from order_status
    where item_total = total;
else
    select o_status,item_total,remarks,order_no
    from order_status
    where item_total = total;
    update order_status
    set remarks = 'set';
end if;
end

我期望输出获得每行的item_total。如果item_total> 2,它只会选择,否则,它会更新备注..每个c_id都有不同的no。 item_total。

1 个答案:

答案 0 :(得分:0)

你的代码有点争吵,所以我会尽力帮助你做一件事。

你的(1),其中c_id> 3,这样做的目的是什么,这将给所有ID大于3的客户,但确定。 为了便于阅读,格式化查询也是一件好事。也, USE表别名,特别是当您进入更长的表名引用时,使其更容易 分别加入/链接/获取字段/ where / group。即使是一张桌子。

select 
      c.c_id,
      c.lname,
      c.address,
      c.city,
      c.description
   from 
      customer c
   where 
      c.c_id > 3;

你的(2a)。您的查询执行从客户表到基于订单状态的简单连接 客户的ID。这没关系,但它也会返回所有有订单的客户, 如果有人有多个订单,它会向客户显示他们拥有的每个订单。 另外,尝试养成在表上使用JOIN条件而不是隐含连接的习惯 在WHERE子句中。当您需要进入左/右连接条件时,它会更容易。

select 
      c.c_id,
      c.lname,
      c.address,
      o.o_status,
      o.item_total,
      o.remarks,
      c.description
   from 
      customer c
         JOIN order_status o
            ON c.c_id = o.c_id;

现在,如果您只关心特定客户,请为所述客户ID添加WHERE子句。

你的(2b)组件将描述更新为'black',其中c_id = 3,没关系

update customer
   set description = 'black'
   where c_id = 3;

对于#3,item_total> 2.这个项目的总和是什么基础。你有

declare total int ;
select total = item_total
   from order_status;

这不应该真正做任何事情,因为它正在经历每一个订单,并将返回 每条记录1(真)或0(假)。您没有标准,例如每位客户的总数 甚至只是给定客户的订单数量......如人“A”有5个订单存档, 人“B”有1,人“C”有2.你需要澄清你的意图。 这会根据item_total>对if / else进行跟进。 2.选择版本(a)或(b) 又一个查询(不会复制/粘贴那个不知道你的意图)

在if(total> 2)else条件中,update语句没有WHERE子句, 所以它会更新order_status表中的每条记录(可能不是你想要的)。

所以,稍微澄清一点,也许我自己和其他人可以提供一些样本数据 即使作为新手,如果有其他事情可能是保密的,你总是可以掩饰 事情只显示关键部分,但实际上并没有显示生产数据,但显示 样本数据,以帮助我们满足您的需求......现在和将来。