Android 如何在SQL中的非键上运行DISTINCT
我有一个数据库,它可以有相似的行,但有不同的键和不同的布尔列。以下是数据库的外观: 列:_id、名称、img、地址、可用 两个条目可以如下所示:Android 如何在SQL中的非键上运行DISTINCT,android,sql,sqlite,Android,Sql,Sqlite,我有一个数据库,它可以有相似的行,但有不同的键和不同的布尔列。以下是数据库的外观: 列:_id、名称、img、地址、可用 两个条目可以如下所示: _id | name | img | address | available ------------------------------------------------------- 1 | John | http://img.com/222 | 1 Main St | 1 2 | John | http
_id | name | img | address | available
-------------------------------------------------------
1 | John | http://img.com/222 | 1 Main St | 1
2 | John | http://img.com/222 | 1 Main St | 0
我想要一个查询,它将为我提供所有具有不同键的结果,如果有重复的条目(忽略_id会不同的事实),它将只返回第一个条目。以下是我的疑问:
SELECT p1.*
FROM (SELECT DISTINCT _id, available FROM people) p
INNER JOIN people p1
ON p1._id=p._id
ORDER BY p1.available DESC;
我知道这是不对的,但也许这能解释我在寻找什么。我想在此处使用GROUP BY吗?此sql可能会解决您的问题:
选择b.*from(select distinct _idfrom people)a,people b,其中a._id=b._id按b排序可用实际上我刚刚问了一个类似的问题,并从一位经验丰富的用户那里得到了一个很好的答案: 根据他告诉我的,也许这个查询会为你提供你想要的:
SELECT p1.*
FROM (SELECT DISTINCT _id, name from people) p
INNER JOIN people p1
ON p1._id=p._id
ORDER BY p1.available desc
道歉,如果这是一个失败,并没有工作
编辑:我突然想到,我不知道这将提取哪个不同的名称+\u id组合..可用=1或可用=0或随机选择..!让我知道到底发生了什么..
我想要一个查询,它将为我提供所有具有不同键的结果,以及是否有重复项(忽略_-id可能不同的事实),它将只返回第一个。_-id不是我想要区分的,因为它们(id)已经是唯一的。……理想情况下,它将按“可用”降序排列,以便如果有两列具有相同的数据(除了_-id和可用之外),它将为可用列返回带有“1”的行
select name, image, address, max(availability) as avail
from T
group by name, image, address
然后,您可以将上述查询返回的集合作为内联视图加入到表中:
select * from T
inner join
(
select name, image, address, max(availability) avail
from T
group by name, image, address
) as foo
on T.name = foo.name and T.image = foo.image and T.address = foo.address and T.availability = foo.avail
如果有一个复合索引(姓名、图片、地址)会有所帮助
警告:如果有多行特定的{name,image,address}空间坐标轴的Availability=1,则查询将为空间坐标轴返回多行:
2 | John | http://img.com/222 | 1 Main St | 1
6 | John | http://img.com/222 | 1 Main St | 1
另外,听起来好像您希望表中的空间坐标轴(名称、图像、地址)已被创建为一个备用唯一键。如果您希望第一行的
\u id
值在可用值最高的行中最低(介于1和0之间),您可以“录制”分组生成的聚合值中的\u id
要比较的值的构造方式是,按可用的字段降序排列记录,然后按\u id
字段降序排列记录,并允许使用模运算符轻松检索\u id
的值(假设可用最大值为1,且ID从不超过100000000)
我改编了它
您也可以这样做:
谢谢你的尝试,但这没有。我试过了。我想这里的问题是_id不是我想要区分的,因为它们已经是唯一的。这是对自己使用相同的数据集,并且总是会给出与select*相同的结果。你对“第一个”的定义是什么?它是由可用列决定的?还是只是随机决定的?好问题。很抱歉我漏掉了。理想情况下,它将按“可用”降序排列,以便如果有两列具有相同的数据(除了_id和可用),它将为可用列返回带有“1”的行。嘿,Jacky,谢谢,这很接近,但问题是这两行上的_id字段不同,因此它会认为它们在内部查询中是不同的。_id和“available”列是唯一的,但其他字段不是。我将原始字段更新为我尝试的查询.谢谢你的帮助!非常好!就是这样。分组方式是关键信息。有了它,我甚至不需要复杂的内部连接,只需要内部连接t.。\u id=foo_id@Du3:但是不应该有foo.id,因为分组是按三元组(名称、图像、地址)进行的。
select people.* from people
inner join (
select name, img, address,
min((1-available)*100000000 + _id) avail_id
from people group by name, img, address
) as foo on people._id = foo.avail_id % 100000000;
select people.* from people
left outer join people as other on
other.name = people.name and
other.img = people.img and
people.address=other.address and
(1 - people.available) * 100000000 + people._id >
(1 - other.available) * 100000000 + other._id
where other.available is null;