两个表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=INNODBDEFAULT 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’这个条件,还望帮忙啊:( 大家帮帮忙的哈 本帖最后由 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中,利用序号相等的方式 回答完,我的问题后,我可以给你SQL语句 je_ck 发表于 2011-8-3 12:58 static/image/common/back.gif
问题有些不清晰。
问题1:order_followup对单次order的跟踪只有2条,一条open,一条close。是吗?
问题2: ...
问题1:order有不同的状态,不同状态对应一条order_followup,而order_followup只有两种状态open或close;
问题2:如果order被提交了即order关闭了,则不需要添加order_followup;
问题3:id的增加与时间是一致的
谢谢! je_ck 发表于 2011-8-3 12:58 static/image/common/back.gif
问题有些不清晰。
问题1:order_followup对单次order的跟踪只有2条,一条open,一条close。是吗?
问题2: ...
order的处在某种状态时也可以有多个order_followup 本帖最后由 je_ck 于 2011-8-4 06:07 编辑
每次每个order的open与close都是一一对应的吗?
对于某个order来说。状态如下:
open
open
close
它的是否是要的记录。(因为它连续2次open,一个close)
je_ck 发表于 2011-8-4 04:46 static/image/common/back.gif
每次每个order的open与close都是一一对应的吗?
对于某个order来说。状态如下:
open
对于某个order来说。状态如下:
open
open
close
它不是要的记录
因为它最近的一次跟踪已经完毕
需要找的是最近一次的跟踪是open状态:)
je_ck 发表于 2011-8-3 12:59 static/image/common/back.gif
回答完,我的问题后,我可以给你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)
不知这样写是否清楚
OK.好像没有88805,结果是88802、88804
select t1.order_no case when t1.c1>t2.c1 then 0 else 1 end as selectorder
(selectorder_no,max( id)as c1 from order_followup wherestatus = 'open' group byorder_no) as t1 left join
(selectorder_no,max( id)as c1 from order_followup wherestatus = 'close' group byorder_no) as t2
on ti.order_no = t2.order_no
selectorder为1的就是选中的。 je_ck 发表于 2011-8-5 05:09 static/image/common/back.gif
OK.好像没有88805,结果是88802、88804
select t1.order_no case when t1.c1>t2.c1 then 0 else 1 end a ...
谢谢:) 是不是还有88806和88805没有查询出来。 完整SQL语句如下:
select order.* from order left join (select t1.order_no case when t1.c1>t2.c1 then 0 else 1 end as selectorder
(selectorder_no,max( id)as c1 from order_followup wherestatus = 'open' group byorder_no) as t1 left join
(selectorder_no,max( id)as c1 from order_followup wherestatus = 'close' group byorder_no) as t2
on ti.order_no = t2.order_no) as t3 on order.order_no = t3.order_no and selectorder = 1 je_ck 发表于 2011-8-6 06:02 static/image/common/back.gif
完整SQL语句如下:
select order.* from order left join (select t1.order_no case when t1.c1>t2.c1 the ...
谢谢:)
页:
[1]