SQLite按3个字段排序,并为每个类别返回top 1


public Cursor fetchAllPBs() {       
    String sql = "SELECT * FROM " + CAPTURES_TABLE + " GROUP BY " + KEY_CAPTURES_SPECIES 
            + " ORDER BY " + KEY_CAPTURES_POUNDS + " DESC, " + KEY_CAPTURES_OUNCES + " DESC, " + KEY_CAPTURES_DRAMS + " DESC;";
    Cursor c = mDb.rawQuery(sql, null);
    if(c != null) {
        c.moveToFirst();
    }
    return c;
}

,你好

我希望上面的查询返回每个物种的用户个人最佳,即每个物种中最重的物品。最近对它进行了适当的测试,我发现了一个问题。在这个项目中,我对SQL还是比较陌生的…

假设我在数据库中添加了一个7磅6盎司0drms的"Chub",然后添加了另一个7磅2盎司0drms的鱼-它将返回最近添加的鱼作为PB,而不是最大的(7磅2盎司)。然而,如果我再加一桶8磅0盎司0磅的鱼,它会返回8磅的鱼——似乎它不是按盎司来排序的,可能我也认为是按盎司来排序的。

谁能看出这里有什么问题并提出解决方案?

多谢

首先,您需要一个子查询来确定每个物种最重的鱼。其次,你的权重被分成3列,所以你需要以某种方式添加它们。我选择用乘法将它们相加,应该足以得到最大值。

SELECT *
FROM CAPTURES_TABLE AS C1
WHERE (100*Pounds+10*Ounces+Drams) = 
      (SELECT MAX(100*Pounds+10*Ounces+Drams) 
      FROM CAPTURES_TABLE AS C2
      WHERE C2.SPECIES=C1.SPECIES)
ORDER BY pounds DESC, ounces DESC, drams DESC

更多的注释,但我需要更多的空间…

如果我简化你的查询,它看起来像:

SELECT * FROM table1 WHERE species = species_id 
ORDER BY pounds DESC, ounces DESC, drams DESC LIMIT 1

如果species是而不是唯一字段,则查询正常。

看起来问题在于,当添加一条新鱼时,您没有添加,而是实际上替换了鱼,尝试移除limit 1,看看是否所有的鱼都出现了。
订购条款绝对正确。

最新更新