【问题标题】:Determining SQLite GROUP BY row selection确定 SQLite GROUP BY 行选择
【发布时间】:2020-03-11 18:36:36
【问题描述】:

假设我正在尝试在产品列表中搜索产品,因为有人在两个 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

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

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

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

【问题讨论】:

  • 为什么要使用 GROUP BY?您的要求不涉及聚合。此外,您必须澄清优先级的顺序。它们是否像查询中的 ORDER BY 子句的 CASE 表达式一样定义?

标签: android sqlite group-by android-sqlite sql-order-by


【解决方案1】:

我认为您不需要这么复杂的查询。
使用查询中的 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" 替换为用户键入的值。

【讨论】:

    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 2011-12-16
    • 2021-12-24
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多