首页 > 解决方案 > 确定 SQLite GROUP BY 行选择

问题描述

假设我正在尝试在产品列表中搜索产品,因为有人在两个 AutoCompleteTextViews 中键入。在这种情况下,假设制造商中的“H”和描述中的“PR”

现在,数据库有 HP 打印机,还有 HP 笔记本电脑、服务器等。此外,假设有一个像 Hitachi 这样的制造商,其中有一个 H,但我当前的数据库没有任何打印机,但它确实有一些 Hitachi 条目也许是扫描仪。

所以,这大致是我觉得合乎逻辑的结果顺序:

  1. 首先匹配两列。也许用户正在搜索 HP 打印机,它应该是第一个,因为在两列中匹配,从字符串开头 ( LIKE "x%") 开始按最佳字母匹配顺序排列。
  2. 描述列中的匹配项。也许两者都不匹配,所以在那之后我想列出每个连接有打印机的制造商。
  3. 制造商列中的匹配项从最佳字母匹配开始。也许用户想在数据库中输入一台新的日立品牌打印机,所以我想提出这个建议。

所以,假设他们为打印机输入了 PR,在 HP/Hitachi 的开头输入了 H。我可以过滤掉除打印机之外的所有内容,所以我的结果是:

HP      | Printer
RICOH   | Printer
BROTHER | Printer

但是我没有日立。

或者我可以取出description过滤器并列出每个制造商,首先按制造商描述匹配排序,然后得到如下内容:

RICOH   | Printer
BROTHER | Printer
HAIER   | TV
HITACHI | Scanner
HP      | PC
HON     | Filing Cabinet

现在GROUP BY已分组到包含 HP 但用于 PC 而非打印机的行中,因此稍后将对其进行分类。

有什么方法可以过滤 GROUP BY 选择的行吗?我假设它只是抓住了第一个结果。这就是我想要的样子:

HP      | Printer
RICOH   | Printer
BROTHER | Printer
HAIER   | TV
HITACHI | Scanner
HON     | Filing Cabinet

这是我目前正在玩弄的,AND INSTR(UPPER(description), UPPER("PR")) != 0WHERE子句中加上或减去一个:

SELECT _id, manufacturer, description 
FROM `tblProducts` 
WHERE (manufacturer || description) IN 
(
    SELECT (manufacturer || description)
    FROM `tblProducts`
    WHERE INSTR(UPPER(manufacturer), UPPER("H")) != 0
    GROUP BY manufacturer, description
)
GROUP BY manufacturer 
ORDER BY 
    CASE
        WHEN INSTR(UPPER(description), "PR") != 0 AND UPPER(manufacturer) LIKE "H%" 
        THEN 1 
        WHEN INSTR(UPPER(description), "PR") != 0 AND INSTR(UPPER(manufacturer), "H") != 0 
        THEN 2 
        WHEN INSTR(UPPER(manufacturer), "H") != 0 
        THEN 3 
        WHEN INSTR(UPPER(description), "PR") != 0 
        THEN 4 
        ELSE 5 
        END ASC

ps " ||" 类似于CONCAT()那些来自不同 SQL 背景的人。

标签: androidsqlitegroup-byandroid-sqlitesql-order-by

解决方案


我认为您不需要如此复杂的查询。
使用CASE查询中的该表达式来定义优先级,以便您可以过滤和排序:

SELECT t._id, t.manufacturer, t.description
FROM (
  SELECT _id, manufacturer, description,
    CASE
        WHEN INSTR(UPPER(description), "PR") != 0 AND UPPER(manufacturer) LIKE "H%" THEN 1 
        WHEN INSTR(UPPER(description), "PR") != 0 AND INSTR(UPPER(manufacturer), "H") != 0 THEN 2 
        WHEN INSTR(UPPER(manufacturer), "H") != 0 THEN 3 
        WHEN INSTR(UPPER(description), "PR") != 0 THEN 4 
        ELSE 5 
    END priority 
  FROM `tblProducts` 
) t
WHERE t.priority <= 4
ORDER BY t.priority

"PR"和替换"H"为用户键入的值。


推荐阅读