MySQL取值问题,一表格有重覆产品数据,只单取1笔值

如题,一表格会重覆很多次相同的产品值 product_id
但我每个值只取1个
情况1:取每笔数值时间为最新的1笔

情况2:我指定一个时间范围,在范围中取最新的1笔

请问SQL的语法如何实现呢? 感谢各位!

如下 (注意_,时间精准到秒数_)
图片说明

1

9个回答

如果是查询整条数据可以用一下sql

情况一:

 SELECT * FROM `tablename` t1 
RIGHT JOIN 
    (SELECT t.`product_id` AS product_id ,MAX(t.`Updatedate`) AS Updatedate 
    FROM `tablename` t 
    GROUP BY t.`product_id`) t2
ON t1.`product_id` = t2.`product_id` AND t1.`Updatedate` = t2.`Updatedate`;

情况2:

 SELECT * FROM `tablename` t1 
RIGHT JOIN 
    (SELECT t.`product_id` AS product_id ,MAX(t.`Updatedate`) AS Updatedate 
    FROM `tablename` t 
    WHERE t.`Updatedate` >'2018-06-07' AND t.`Updatedate`<'2018-06-09'
    GROUP BY t.`product_id`) t2
ON t1.`product_id` = t2.`product_id` AND t1.`Updatedate` = t2.`Updatedate`;
1
weixin_40187983
weixin_40187983 请问这是mysql还是sqlserver呢? 我用mysql执行不了
大约一年之前 回复

当你发现这个sql很难有效查询的时候就该要从设计上去优化了,你这个sql就算写出来效率也很低。
表中增加一个字段吧,new_flag 1为最新 0为旧数据。每次product_id最新数据保存的时候,更新旧数据为0。

查询时只用查询new_flag = 1的数据就行了

2

写一个存储过程,参数三个,第一个为最新的时间,设置1有效,取最新,第二个第三个参数传入日期参数,有值即为有效。

1

情况一:SELECT t.product_id,MAX(t.Updatedate) FROM tablename t GROUP BY t.product_id ;
情况二:SELECT t.product_id,MAX(t.Updatedate) FROM tablename t WHERE t.Updatedate >'2018-06-07' AND t.Updatedate<'2018-06-09' GROUP BY t.product_id ;

1
weixin_40187983
weixin_40187983 如果这个数据有100万或是更多的时候,效率如何呢? 或是我要怎么改
大约一年之前 回复

1.SELECT * FROM tb_table WHERE product_id IN(
SELECT distinct product_id FROM tb_table WHERE MAX(Updatedate) GROUP BY product_id
);

2

1
weixin_40187983
weixin_40187983 如果这个数据有100万或是更多的时候,效率如何呢? 或是我要怎么改
大约一年之前 回复

SELECT * FROM TABLE_NAME T WHERE ROWNUM = 1 GROUP BY T.PRODUCT_ID ORDER BY UPDATEDATE ;

SELECT * FROM TABLE_NAME T
WHERE ROWNUM = 1
AND UPDATEDATE BETWEEN UPDATEDATE1 AND UPDATEDATE2

GROUP BY T.PRODUCT_ID
ORDER BY UPDATEDATE ;
未验证,给与思路

1

直接按时间倒序排序,取最后的一条limt 1 不就行了

1

/**
创建添加定义一个要求一:取每一笔值时间为最新的一笔
/
SELECT id,priduct_id, MAX(UpdateDateDate) FROM product GROUP BY priduct_id;
/

创建添加定义一个要求二:指定一个范围内查询这个范围内最新的一笔(方式一)
/
SELECT id,MAX(UpdateDateDate),priduct_id FROM product WHERE UpdateDateDate BETWEEN '2018-01-01' AND '2018-03-04';
/

创建添加定义一个要求二:指定一个范围内查询这个范围内最新的一笔(方式二)
**/
SELECT id,MAX(UpdateDateDate),priduct_id FROM product WHERE UpdateDateDate >='2018-01-01' AND UpdateDateDate<= '2018-03-04';

0

SELECT * FROM tablename t1
where not exists (select 1 from tablename t2 where t1.product_id=t2.product_id and t1.Updatedate<t2.Updatedate)

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!