MySQL社区

标题: 两个表left join 找出符合条件的记录 [打印本页]

作者: jingxingok    时间: 2011-8-3 10:39
标题: 两个表left join 找出符合条件的记录
两张表分别为
CREATE TABLE `order` (
  `order_no` INT(11) NOT NULL AUTO_INCREMENT,
  `alt_order_no` VARCHAR(20) DEFAULT NULL,
  `cust_no` INT(11) NOT NULL COMMENT 'customer no',
  `order_type` VARCHAR(20) NOT NULL COMMENT 'order type',
  `order_date` DATETIME NOT NULL,
) ENGINE=INNODB  DEFAULT CHARSET=utf8;

CREATE TABLE `order_followup` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `order_no` INT(11) NOT NULL,
  `status` VARCHAR(20) DEFAULT NULL,
  `followup_date` DATETIME DEFAULT NULL,
  `followup_by` INT(11) DEFAULT NULL,
  `message` TEXT,
  `next_followup_date` DATETIME DEFAULT NULL,
  `next_followup_task` VARCHAR(200) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `order_no` (`order_no`),
  CONSTRAINT `order_followup_ibfk_1` FOREIGN KEY (`order_no`) REFERENCES `order` (`order_no`)
) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

order_followup是order的跟踪信息,order_followup 的状态可为open ,close,若为close则表示此order的跟踪完毕不需要增加followup了。
现在是要列出需要跟踪的order,即
现在要找最后一条ollowup的状态为open的order,
以及没有followup的order。


本来用left join语句,但不知如何处理‘找最后一条ollowup的状态为open的order’这个条件,还望帮忙啊
作者: jingxingok    时间: 2011-8-3 11:45
大家帮帮忙的哈
作者: je_ck    时间: 2011-8-3 12:58
本帖最后由 je_ck 于 2011-8-3 13:00 编辑

问题有些不清晰。
问题1:order_followup对单次order的跟踪只有2条,一条open,一条close。是吗?
问题2:每个order可以无限开启。是吗?
问题3:时间自然连续。即id的增加与时间是一致的。是吗?

给你2个思路
1:若允许有多个相同的order在order_followup中,利用open与close的个数匹配
2:若不允许有多个相同的order在order_followup中,利用序号相等的方式
作者: je_ck    时间: 2011-8-3 12:59
回答完,我的问题后,我可以给你SQL语句
作者: jingxingok    时间: 2011-8-3 13:28
je_ck 发表于 2011-8-3 12:58
问题有些不清晰。
问题1:order_followup对单次order的跟踪只有2条,一条open,一条close。是吗?
问题2: ...

问题1:order有不同的状态,不同状态对应一条order_followup,而order_followup只有两种状态open或close;
问题2:如果order被提交了即order关闭了,则不需要添加order_followup;
问题3:id的增加与时间是一致的

谢谢!
作者: jingxingok    时间: 2011-8-3 14:09
je_ck 发表于 2011-8-3 12:58
问题有些不清晰。
问题1:order_followup对单次order的跟踪只有2条,一条open,一条close。是吗?
问题2: ...

order的处在某种状态时也可以有多个order_followup
作者: je_ck    时间: 2011-8-4 04:46
本帖最后由 je_ck 于 2011-8-4 06:07 编辑

每次每个order的open与close都是一一对应的吗?
对于某个order来说。状态如下:
open
open
close
它的是否是要的记录。(因为它连续2次open,一个close)

作者: jingxingok    时间: 2011-8-4 08:48
je_ck 发表于 2011-8-4 04:46
每次每个order的open与close都是一一对应的吗?
对于某个order来说。状态如下:
open

对于某个order来说。状态如下:
open
open
close
它不是要的记录
因为它最近的一次跟踪已经完毕

需要找的是最近一次的跟踪是open状态  

作者: jingxingok    时间: 2011-8-4 14:32
je_ck 发表于 2011-8-3 12:59
回答完,我的问题后,我可以给你SQL语句

order_followup
id      order_no   status      followup_date   followup_by    message          next_follow_date                next_follow_task
1       88801       open       2011-01-01         admin          aaaaaaaaaa        2011-01-20                      aaaaaaaaaaaaaaaaa
2       88802       open       2011-02-02         admin          bbbbbbbbb        2011-03-01                     
3       88803       open       2011-02-25         admin         ccccccccccc        2011-03-12                     
4       88801       close       2011-01-20         admin         aaaaaaaaaaa        2011-01-20
5       88802       open      2011-03-01          admin         bbbbbbbbbbbb    2011-03-15                      bbbbbbbbbbbb
6       88803       open       2011-03-12         admin          ccccccccccc       2011-05-05                      ccccccccccccc
7       88802       open       2011-03-15         admin          bbbbbbbbbbbb   2011-08-06                      bbbbbbbbbbbbb
8       88803       close       2011-05-05         admin           ccccccccccccc    2011-05-05
9       88804        open    2011-08-04           admin         ddddddddddd       2011-10-1                       ddddddddddddd

order
88801
88802
88803
88804
88805
88806


现在要求得到order   88802,88804,88805 ,即可以继续加followup的order(包括followup最新状态为open和还没有被加followup的order)

不知这样写是否清楚


作者: je_ck    时间: 2011-8-5 05:09
OK.好像没有88805,结果是88802、88804

select t1.order_no case when t1.c1>t2.c1 then 0 else 1 end as selectorder
(select  order_no,max( id)  as c1 from order_followup where  status = 'open' group by  order_no) as t1 left join
(select  order_no,max( id)  as c1 from order_followup where  status = 'close' group by  order_no) as t2
on ti.order_no = t2.order_no

selectorder为1的就是选中的。
作者: jingxingok    时间: 2011-8-5 14:50
je_ck 发表于 2011-8-5 05:09
OK.好像没有88805,结果是88802、88804

select t1.order_no case when t1.c1>t2.c1 then 0 else 1 end a ...

谢谢
作者: je_ck    时间: 2011-8-6 06:00
是不是还有88806和88805没有查询出来。
作者: je_ck    时间: 2011-8-6 06:02
完整SQL语句如下:
select order.* from order left join (select t1.order_no case when t1.c1>t2.c1 then 0 else 1 end as selectorder
(select  order_no,max( id)  as c1 from order_followup where  status = 'open' group by  order_no) as t1 left join
(select  order_no,max( id)  as c1 from order_followup where  status = 'close' group by  order_no) as t2
on ti.order_no = t2.order_no) as t3 on order.order_no = t3.order_no and selectorder = 1
作者: jingxingok    时间: 2011-8-8 16:37
je_ck 发表于 2011-8-6 06:02
完整SQL语句如下:
select order.* from order left join (select t1.order_no case when t1.c1>t2.c1 the ...

谢谢




欢迎光临 MySQL社区 (http://www.mysqlpub.com/) Powered by Discuz! X3.2