Определение выбора строки SQLite GROUP BY - PullRequest
0 голосов
/ 11 марта 2020

Допустим, я пытаюсь найти список продуктов для продукта, который человек вводит в двух AutoCompleteTextView. В этом случае, скажем, «H» в производителе и «PR» в описании

Теперь в базе данных есть принтеры HP, а также ноутбуки HP, серверы и т. Д. c. Кроме того, скажем, есть такой производитель, как Hitachi, в котором есть буква H, но в моей текущей базе данных нет принтеров, но в нем есть записи Hitachi для, возможно, сканера.

Итак, это примерно порядок следования, который я считаю логичным:

  1. Соответствует первым в обоих столбцах. Возможно, пользователь ищет принтер HP, он должен быть первым, потому что совпадает в двух столбцах, в порядке наилучшего алфавитного совпадения от начала строки (LIKE "x%").
  2. Соответствует в столбце описания. Возможно, нет совпадений для обоих, поэтому после этого я хочу перечислить всех производителей, к которым подключен принтер.
  3. Совпадения в столбце производителя, начиная с наилучшего совпадения по алфавиту. Возможно, пользователь захочет ввести в базу данных новый принтер Hitachi, поэтому я хочу, чтобы появилось это предложение.

Итак, допустим, они набрали PR для принтера, а H - для начало HP / Hitachi. Я мог отфильтровать все, кроме принтеров, так что мои результаты:

HP      | Printer
RICOH   | Printer
BROTHER | Printer

Но у меня нет Hitachi.

Или я мог бы вынуть фильтр description и перечислить всех производителей , отсортированные по описанию производителя, сначала совпадают и получают что-то вроде:

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

Теперь GROUP BY сгруппирован в строку, содержащую HP, но для P C, а не для принтера, поэтому он сортируется позже в процессе.

Есть ли способ отфильтровать, какую строку выбирает GROUP BY? Я предполагаю, что это просто захват первого результата. Вот что я хочу чтобы он выглядел следующим образом:

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

В настоящее время я играю с плюсом или минусом AND INSTR(UPPER(description), UPPER("PR")) != 0 в предложении WHERE:

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 фон.

1 Ответ

0 голосов
/ 11 марта 2020

Не думаю, что вам нужен такой сложный запрос. Используйте это выражение 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" значениями, которые вводит пользователь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...