MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 6936|回复: 13
打印 上一主题 下一主题

[SQL类] 两个表left join 找出符合条件的记录

[复制链接]
跳转到指定楼层
1#
发表于 2011-8-3 10:39:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两张表分别为
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’这个条件,还望帮忙啊
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
2#
 楼主| 发表于 2011-8-3 11:45:49 | 只看该作者
大家帮帮忙的哈
3#
发表于 2011-8-3 12:58:55 | 只看该作者
本帖最后由 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中,利用序号相等的方式
4#
发表于 2011-8-3 12:59:19 | 只看该作者
回答完,我的问题后,我可以给你SQL语句
5#
 楼主| 发表于 2011-8-3 13:28:49 | 只看该作者
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的增加与时间是一致的

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

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

每次每个order的open与close都是一一对应的吗?
对于某个order来说。状态如下:
open
open
close
它的是否是要的记录。(因为它连续2次open,一个close)
8#
 楼主| 发表于 2011-8-4 08:48:41 | 只看该作者
je_ck 发表于 2011-8-4 04:46
每次每个order的open与close都是一一对应的吗?
对于某个order来说。状态如下:
open

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

需要找的是最近一次的跟踪是open状态  
9#
 楼主| 发表于 2011-8-4 14:32:07 | 只看该作者
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)

不知这样写是否清楚

10#
发表于 2011-8-5 05:09:58 | 只看该作者
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的就是选中的。
11#
 楼主| 发表于 2011-8-5 14:50:26 | 只看该作者
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 ...

谢谢
12#
发表于 2011-8-6 06:00:43 | 只看该作者
是不是还有88806和88805没有查询出来。
13#
发表于 2011-8-6 06:02:50 | 只看该作者
完整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
14#
 楼主| 发表于 2011-8-8 16:37:00 | 只看该作者
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 ...

谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-5-2 16:34 , Processed in 0.074953 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表