【问题标题】:Android SQLite: Select No Duplicates in SQL QueryAndroid SQLite:在 SQL 查询中选择 No Duplicates
【发布时间】:2011-08-07 12:45:38
【问题描述】:

我有一个充满值的数据库和来源中的一列(特定项目的来源)。我正在尝试使用数据库中列出的所有来源填充微调器,但显然我只希望它们重复一次。我正在尝试使用sql语句:

String sql = "SELECT _id, origin FROM items GROUP BY origins";

但我也使用自定义 SimpleCursorAdapter 来填充微调器,因此我还需要查询 _id 列。当我将 _id 列添加到查询中时,它会生成一个包含所有重复来源的查询,因为 id 使它成为没有行重复的地方。我需要做什么来传递两列,但删除重复项?能够按字母顺序组织它们也很棒!

【问题讨论】:

    标签: android sqlite spinner


    【解决方案1】:

    您会得到一个包含重复原始值的视图,因为每个原始值都可以“属于”多个 id。

    我不认为以下是“干净”的解决方案,但它不会为您提供重复值以及与每个原始值对应的最高 id:

    Select origin, max(_id) from items group by origin
    

    【讨论】:

    • 这不起作用,因为在我的情况下,自定义 simplecursoradapter 需要整个 _id 列并且它会引发异常。
    • 我对 simplecursoradapter 不太了解,但可能会因为名称不同而感到困惑 try 而不是 "max(_id)" -> "max(_id) as _id"。
    【解决方案2】:

    您也可以考虑规范化您的数据库。您可以创建一个单独的来源参考表,而不是在表中多次重复来源。然后,在您的原始表中,您可以通过它的主键引用原点。例如:

    起源 *********************** 身份证名称 ---------------------- 1 起源_1 2起源_2 3 起源_3 *********************** 详细数据 ****************************** id origin_id 数据 1 1 ... 2 1 ... 3 3 ... 4 3 ... ******************************

    然后,如果您只想要存在数据的来源,您可以执行以下操作:

    SELECT DISTINCT o.* 
    FROM origins AS o 
    JOIN detail_data AS dd ON (dd.origin_id = o.id)
    ORDER BY o.name ASC;
    

    我通常更喜欢规范化数据库,因为规范化可以提供诸如减少占用空间、更清晰的数据和更灵活的结构等优点。然而,我承认,与传统的数据库系统(即台式机、服务器)相比,Android 的规范化似乎不太有利。规范化也有缺点,例如更复杂的查询(如上所示)。但是,为了最大限度地提高长期的灵活性、可维护性和稳健性,规范化可能是更好的方法。

    【讨论】:

    • +1 用于建议标准化 - 绝对是数据库设计的好方法。
    【解决方案3】:

    要添加到 Preli 的答案,如果您希望它们按字母顺序排列,只需将其更改为:

    SELECT origin, MAX(_id) FROM items GROUP BY origin ORDER BY origin
    

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      相关资源
      最近更新 更多