问一个 sql 语句

sjfdesolve   (dfljsdklfjsdlkfjsd)2018-12-06 13:28:40
一个表里有三个字段(id product_id date),现在要查询满足以下条件的订单 ID:
1 今年没有任何记录有这个product_id
2 今年以前其他年份存在记录有这个product_id
用一个 sql 语句写出来
怎么写?
sjfdesolve   (dfljsdklfjsdlkfjsd)2018-12-06 13:39:28
具体语句?
union?这应该是互斥的啊
怎么union?
【 在 tombcy (还是说世界和平的事儿吧) 的大作中提到: 】
: 两个sql union all
SPWaistcoat   (clear)2018-12-06 15:15:32
用not exists 子查询
【 在 sjfdesolve 的大作中提到: 】
: 一个表里有三个字段(id product_id date),现在要查询满足以下条件的订单 ID:
--来自微水木3.3.5
yytree   (yytree)2018-12-06 15:55:24
$300
a.pid != b.pid
【 在 sjfdesolve 的大作中提到: 】
: 一个表里有三个字段(id product_id date),现在要查询满足以下条件的订单 ID:
sjfdesolve   (dfljsdklfjsdlkfjsd)2018-12-06 16:09:38
这需要子查询了吧
如果要求没有子查询呢?
【 在 yytree (yytree) 的大作中提到: 】
: $300
sjfdesolve   (dfljsdklfjsdlkfjsd)2018-12-06 16:09:52
如果要求没有子查询呢?
【 在 SPWaistcoat (clear) 的大作中提到: 】
: 用not exists 子查询
Cowry   (诗酒年华~皇图霸业谈笑中,不胜人生一场醉)2018-12-06 17:11:30
什么客户还有这样的要求?
【 在 sjfdesolve (dfljsdklfjsdlkfjsd) 的大作中提到: 】
: 如果要求没有子查询呢?
yytree   (yytree)2018-12-06 21:29:10
Yes
【 在 sjfdesolve 的大作中提到: 】
: 这需要子查询了吧
feitutuaaa   (feitutuaaa)2018-12-07 08:19:32
两个查询要按照下面的查询结果去限制(不满足情况的话自己修改一下查询条件):
select date from yourtable where product_id!=1 and date=2018 group by date
select date from yourtable where product_id=1 and date<2018 group by date
然后就是把两次查询组合起来:
select id,product_id,date,'condition1' from yourtable where product_id!=1 and date in (select date from yourtable where product_id!=1 and date=2018 group by date)
union
select id,product_id,date,'condition2' from yourtable where product_id=1 and date in (select date from yourtable where product_id=1 and date<2018 group by date);
下面是mysql的创建表和插入测试数据的语句
CREATE TABLE `yourtable` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`product_id` int(10) unsigned NOT NULL,
`date` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
INSERT INTO `yourtable` (`id`,`product_id`,`date`) VALUES
(1,1,2018),
(2,2,2018),
(3,1,2017),
(4,3,2016),
(5,1,2015),
(6,6,2012),
(7,7,2011);
如果你的date字段是datetime类型,修改sql,用year()函数取出年份即可
Exialin   (July)2018-12-07 14:29:25
用case ... when就能组合在一句了呀
【 在 feitutuaaa (feitutuaaa) 的大作中提到: 】
: 两个查询要按照下面的查询结果去限制(不满足情况的话自己修改一下查询条件):
lipp   ( )2018-12-07 20:45:33
left join就可以。
SELECT 订单.ID
FROM 订单
LEFT JOIN (SELECT DISTINCT product_id FROM 订单 WHERE YEAR(date)=今年) 今年产品 ON 今年产品.product_id=订单.product_id
WHERE YEAR(订单.date)<今年 AND 今年产品.product_id IS NULL
【 在 sjfdesolve 的大作中提到: 】
: 一个表里有三个字段(id product_id date),现在要查询满足以下条件的订单 ID:
--【特快水木】
sjfdesolve   (dfljsdklfjsdlkfjsd)2018-12-08 16:09:47
有子查询啊
要求没有子查询呢
【 在 lipp 的大作中提到: 】
: left join就可以。
lipp   ( )2018-12-09 13:26:33
改成没有子查询也简单,但是手机敲字不方便,你自己改吧。
【 在 sjfdesolve 的大作中提到: 】
: 有子查询啊
:
vmx   (战斗劳动妇男王小桃)2018-12-10 08:14:18
为啥有这种奇怪的需求,作业?
【 在 sjfdesolve (dfljsdklfjsdlkfjsd) 的大作中提到: 】
: 有子查询啊
sjfdesolve   (dfljsdklfjsdlkfjsd)2018-12-10 15:48:53
面试题
【 在 vmx 的大作中提到: 】
: 为啥有这种奇怪的需求,作业?
feitutuaaa   (feitutuaaa)2018-12-16 21:34:15
确实你的方法更好
【 在 Exialin 的大作中提到: 】
: 用case ... when就能组合在一句了呀

水木社区