Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在SQL中的非键上运行DISTINCT_Android_Sql_Sqlite - Fatal编程技术网

Android 如何在SQL中的非键上运行DISTINCT

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、名称、img、地址、可用

两个条目可以如下所示:

_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;