Допустим, я пытаюсь найти список продуктов для продукта, который человек вводит в двух AutoCompleteTextView. В этом случае, скажем, «H» в производителе и «PR» в описании
Теперь в базе данных есть принтеры HP, а также ноутбуки HP, серверы и т. Д. c. Кроме того, скажем, есть такой производитель, как Hitachi, в котором есть буква H, но в моей текущей базе данных нет принтеров, но в нем есть записи Hitachi для, возможно, сканера.
Итак, это примерно порядок следования, который я считаю логичным:
- Соответствует первым в обоих столбцах. Возможно, пользователь ищет принтер HP, он должен быть первым, потому что совпадает в двух столбцах, в порядке наилучшего алфавитного совпадения от начала строки (
LIKE "x%"
). - Соответствует в столбце описания. Возможно, нет совпадений для обоих, поэтому после этого я хочу перечислить всех производителей, к которым подключен принтер.
- Совпадения в столбце производителя, начиная с наилучшего совпадения по алфавиту. Возможно, пользователь захочет ввести в базу данных новый принтер 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 фон.