sql 取不重复的值,Distinct只能取一个字段满足不了要求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 取不重复的值,Distinct只能取一个字段满足不了要求相关的知识,希望对你有一定的参考价值。

求助,怎么取出UID为55的用户的图库集,因为我要取出多个参数,所以Distinct满足不了要求,Group by又用不好,希望兄弟们帮帮忙。

参考技术A 假设 uid+tid+lb+px具有唯一性。这里lb限制为1-5
(你应该提供字段描述,实际上从途中看出,uid+tid+px是唯一的,uid+tid相同的lb都相同,px递增)
select * from 图库表 where (tid,uid,lb,px) in (select tid,uid,lb,min(px) from 图库表 where uid=55 and lb between 1 and 5 and group by tid,uid,lb)追问

  uid,tid,lb,px这些都是数值型,最上面那个表是tuku,下面是对应的picture表,我的要求是取出uid为55这个用户的picture中所有的图片,条件是tid不重复,lb=5,px最小的一张。(其实我取的时候会依次取出lb=1-5的,所以说PX最小的一张并不一定是1,因为只有当我要取的lb=1时px最小的才会是1)能加下您QQ吗,我被困在这好久了,没办法往下继续了,请求帮助。

参考技术B select * from 表1 ,表2 ,(select min(px) m_px, tid from 表2 where lib=1 group by uid) 表3
where 表1.id=表2.tid and 表2.lib =1 and 表2.tid = 表3.tid and 表2.px = 表3.m_px追问

不好意思昨天休息,没有及时雨来处理问题,谢谢你的细心回答,你这用的是临时表吧,我一直对临时表不太理解,你写的这个看着有点复杂啊,我套都不知道该怎么往里套,能加下您QQ吗?

追答

你就说你第一张表名和第二张表名吧
我直接给您写成品的sql

追问

第一个表名叫tuku
第二个表名叫picture
uid,tid,lb,px这些都是数值型,最上面那个表是tuku,下面是对应的picture表,也就是我把图片和图库分离开来存储的,因为图片我有多种用途的调用。我的要求是取出uid为55这个用户的picture中所有的图片,条件是tid不重复,lb=5,px最小的一张,因为最小那张默认是封面。方便加个QQ吗:1184973674

追答

select tuku.*,picture.* from tuku,picture,(select tid,lb,min( px ) as min_px from picture group by tid,lb) as tp where tuku.id=picture.tid and picture.tid=tp.tid and picture.lb=tp.lib and picture.px=tp.min_px and picture.lib=5
不知道你的数据库是啥 先写了个通用的sql

追问

该特定字段 'picture.lib' 可以参考 SQL 语句中 FROM 子句列表中的多个表。

我把这里的lib我都改成lb又提示
在对应所需名称或序数的集合中,未找到项目。
这样我把这个数据库直接发给你,麻烦帮我看下,我把无用的表删了,只有二十几K麻烦帮我看下。
http://www.shpzs.com/

本回答被提问者采纳
参考技术C 重复值,是指数据行(rows)存在重复,如果你是取整行,那么只要每一行里面有一个值不重复,取出来的肯定是所有值,因此,你在取值的时候得明确,你想要什么追问

比方说取出uid=55 tid 不重复 lb =1(1-5都是我要用到的) px 最小的一个.

追答

你是想只取封面,还是说取出满足UID=55的所有数据?

如果是仅仅想取出一个具体的ID的第一张,那么:
SELECT TOP 1 * FROM table1 WHERE UID=55 ORDER BY px ASC

追问

这个问题困了我好久了一直没有解决掉,怎么都通不过。能否加下您QQ
我想取的值如下
1,UID=55,tid不重复,lb=1 取px最小的一张。
正确的应该是
id 其它参数...
212 ...
216 ..
225 ...

追答

我给你说思路吧:
1、创建存储过程,并在存储过程中创建临时表
2、在存储过程中进行分组取值,这中间需要用到循环(也就是先把uid,tid分组去重复,得到的是包含所有不重复的UID,TID)
3、根据UID,TID进行分别取值,得到满足自己要求的一行,并定入到前面所创建的临时表中
4、通过查询临时表,返回符合自己要求的数据表

追问

sql2="select xx.* from picture as xx , (select tid,min([px]) as zz from picture where lb=1 group by tid) as yy where xx.tid=yy.tid and xx.px=yy.zz"

最后是这样解决的!

SQL里 distinct 和 union 的区别?

为什么相同的目的分别用这两个结果却不同? 还是我用错了?谢谢

select distinct和union 都会去掉重复的记录,这点的确是有相似的地方。
但是,如果一个表中本来就有重复的记录,你想去除重复的记录,就只能使用select distinct 。
但是如果是想把不只一个表上下合并起来,并去除重复的记录,那么就用union 。
这两个命令使用的用途完全不一样。
参考技术A select distinct和union 都会去掉重复的记录,这点的确是有相似的地方

但是,如果一个表中本来就有重复的记录,你想去除重复的记录,就只能使用select distinct from
tb

但是如果是想把不只一个表上下合并起来,并去除重复的记录,那么就用union

这两个命令使用的用途完全不一样。本回答被提问者采纳
参考技术B union默认是union distinct
使用时应该没有区别,除非你的语句条件有区别
参考技术C 你的sql语句是什麼样的?

以上是关于sql 取不重复的值,Distinct只能取一个字段满足不了要求的主要内容,如果未能解决你的问题,请参考以下文章

在SQL语句中dist是啥意思

Oracle去重复,作用于多列

集合中随机取不重复的索引

JAVA怎么实现从指定范围随机取不重复的6个数字

SELECT DISTINCT 取列中所有不重复的值

SELECT DISTINCT 取列中所有不重复的值