Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 15.11.2015
Сообщений: 88

Сложный запрос из БД

12.10.2017, 15:34. Показов 629. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть БД планшетов.
Есть приложение, где выбираешь характеристики - и тебе подбирают планшеты с этими характеристиками.

Проблема в следующем:
Чтобы приложение мне подобрало планшет - мне необходимо указать все характеристики (а их аж 15 штук).
А необходимо, чтоб приложение давало результат, при указании любого кол-ва характеристик (хоть одной, хоть семи и т.д.).

Пример:
Нужным мне только планшеты АСУС, я нажал чекбокс с этим Брендом и приложение мне показало все АСУСы.

Запрос из БД у меня не блещет красотой и оптимальностью.
Но как сделать иначе не знаю.
Как то нужно сделать выборку по выборке. Т.Е. я в курсор выбрал планшеты с брендом = АСУС. Теперь нужно из этого курсора с АСУСами выбрать только те, у которых цена <= 10000.
И так дальше по остальным 13 характеристиками.
Какая-то множественная выборка.
Но как реализовать?


Код активности где происходит выборка из БД:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
package com.example.covenant.optimization;
 
import static com.example.covenant.optimization.FilterActivity.Acer;
import static com.example.covenant.optimization.FilterActivity.Archos;
import static com.example.covenant.optimization.FilterActivity.Asus;
import static com.example.covenant.optimization.FilterActivity.CP2_yadra;
import static com.example.covenant.optimization.FilterActivity.CP4_yadra;
import static com.example.covenant.optimization.FilterActivity.CP6_yadra;
import static com.example.covenant.optimization.FilterActivity.CP8_yadra;
import static com.example.covenant.optimization.FilterActivity.Digma;
import static com.example.covenant.optimization.FilterActivity.GPS_no;
import static com.example.covenant.optimization.FilterActivity.GPS_yes;
import static com.example.covenant.optimization.FilterActivity.Ginzuu;
import static com.example.covenant.optimization.FilterActivity.Huawei;
import static com.example.covenant.optimization.FilterActivity.Lenovo;
import static com.example.covenant.optimization.FilterActivity.MP13;
import static com.example.covenant.optimization.FilterActivity.MP2;
import static com.example.covenant.optimization.FilterActivity.MP5;
import static com.example.covenant.optimization.FilterActivity.MP8;
import static com.example.covenant.optimization.FilterActivity.OZU1;
import static com.example.covenant.optimization.FilterActivity.OZU2;
import static com.example.covenant.optimization.FilterActivity.OZU3;
import static com.example.covenant.optimization.FilterActivity.OZU4;
import static com.example.covenant.optimization.FilterActivity.Prestigio;
import static com.example.covenant.optimization.FilterActivity.Samsung;
import static com.example.covenant.optimization.FilterActivity.batreya;
import static com.example.covenant.optimization.FilterActivity.black;
import static com.example.covenant.optimization.FilterActivity.cena;
import static com.example.covenant.optimization.FilterActivity.chastota;
import static com.example.covenant.optimization.FilterActivity.diagonal_10;
import static com.example.covenant.optimization.FilterActivity.diagonal_7;
import static com.example.covenant.optimization.FilterActivity.diagonal_8;
import static com.example.covenant.optimization.FilterActivity.diagonal_9;
import static com.example.covenant.optimization.FilterActivity.kitkat;
import static com.example.covenant.optimization.FilterActivity.lollipop;
import static com.example.covenant.optimization.FilterActivity.marshmallow;
import static com.example.covenant.optimization.FilterActivity.metal;
import static com.example.covenant.optimization.FilterActivity.nougat;
import static com.example.covenant.optimization.FilterActivity.plastic;
import static com.example.covenant.optimization.FilterActivity.slot_no;
import static com.example.covenant.optimization.FilterActivity.slot_yes;
import static com.example.covenant.optimization.FilterActivity.storage16;
import static com.example.covenant.optimization.FilterActivity.storage32;
import static com.example.covenant.optimization.FilterActivity.storage64;
import static com.example.covenant.optimization.FilterActivity.storage8;
import static com.example.covenant.optimization.FilterActivity.str_2015;
import static com.example.covenant.optimization.FilterActivity.str_2016;
import static com.example.covenant.optimization.FilterActivity.str_2017;
import static com.example.covenant.optimization.FilterActivity.white;
 
public class FindModelsActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{
 
    public static ListView lv_findModels;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_find_models);
        setTitle("Подходящие модели");
 
        lv_findModels = (ListView) findViewById(R.id.lv_findModels);
        lv_findModels.setOnItemClickListener(this);
 
        showFindModels();
    }
 
    @Override  //Очищаю выбранные характеристики, при нажатии кнопки НАЗАД
    public void onBackPressed() {
        Asus = "";
        Lenovo = "";
        Samsung = "";
        Huawei = "";
        Acer = "";
        Prestigio ="";
        Digma = "";
        Archos = "";
        Ginzuu = "";
 
        cena = "";
 
        str_2015 = "";
        str_2016 = "";
        str_2017 = "";
 
        kitkat = "";
        lollipop = "";
        marshmallow = "";
        nougat = "";
 
        black = "";
        white = "";
 
        metal = "";
        plastic = "";
 
        diagonal_7 = "";
        diagonal_8 = "";
        diagonal_9 = "";
        diagonal_10 = "";
 
        CP2_yadra = "";
        CP4_yadra = "";
        CP6_yadra = "";
        CP8_yadra = "";
 
        chastota = "";
 
        OZU1 = "";
        OZU2 = "";
        OZU3 = "";
        OZU4 = "";
 
        storage8 = "";
        storage16 = "";
        storage32 = "";
        storage64 = "";
 
        slot_yes = "";
        slot_no = "";
 
        MP2 = "";
        MP5 = "";
        MP8 = "";
        MP13 = "";
 
        batreya = "";
 
        GPS_yes = "";
        GPS_no = "";
 
        super.onBackPressed();
    }
 
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        String itemName = ((TextView) view.findViewById(R.id.tvModel)).getText().toString();
        Intent intent = new Intent(this, ModelActivity.class);
        intent.putExtra("name", itemName);
        startActivity(intent);
    }
 
    //==============================================================================================
 
    public void showFindModels() {
        DBHelper dbHelper = new DBHelper(this);
        SQLiteDatabase database = dbHelper.getReadableDatabase();
        Cursor cursor = database.query(
        /*таблица*/                         "tablets",
        /*столбцы*/                         null,
        /*условия "WHERE"*/ "(Бренд = ? or Бренд = ? or Бренд = ? or Бренд = ? or Бренд = ? or Бренд = ? or Бренд = ? or Бренд = ? or Бренд = ?)" +
                            " and (Цена <= ?)" +
                            " and (Год = ? or Год = ? or Год = ?)" +
                            " and (Андроид = ? or Андроид = ? or Андроид = ? or Андроид = ?)" +
                            " and (Цвет = ? or Цвет = ?)" +
                            " and (Материал_корпуса = ? or Материал_корпуса = ?)" +
                            " and (Диагональ = ? or Диагональ = ? or Диагональ = ? or Диагональ = ?)" +
                            " and (ЦП_ядра = ? or ЦП_ядра = ? or ЦП_ядра = ? or ЦП_ядра = ?)" +
                            " and (ЦП_частота <= ?)" +
                            " and (ОЗУ = ? or ОЗУ = ? or ОЗУ = ? or ОЗУ = ?)" +
                            " and (Память = ? or Память = ? or Память = ? or Память = ?)" +
                            " and (Флеш_слот = ? or Флеш_слот = ?)" +
                            " and (МП_камера = ? or МП_камера = ? or МП_камера = ? or МП_камера = ?)" +
                            " and (АКБ <= ?)" +
                            " and (GPS = ? or GPS = ?)",
        /*массив аргументов для условия*/   new String[] {
                            Asus, Lenovo, Samsung, Huawei, Acer, Prestigio, Digma, Archos, Ginzuu,
                            cena,
                            str_2015, str_2016, str_2017,
                            kitkat, lollipop, marshmallow, nougat,
                            black, white,
                            metal, plastic,
                            diagonal_7, diagonal_8, diagonal_9, diagonal_10,
                            CP2_yadra, CP4_yadra, CP6_yadra, CP8_yadra,
                            chastota,
                            OZU1, OZU2, OZU3, OZU4,
                            storage8, storage16, storage32, storage64,
                            slot_yes, slot_no,
                            MP2, MP5, MP8, MP13,
                            batreya,
                            GPS_yes, GPS_no,
                            },
        /*группировка*/                     null,
        /*фильтр для групировки*/           null,
        /*сортировка*/                      "Цена"
        );
 
        if (cursor.moveToFirst()){
            String[] from = new String[]{cursor.getColumnName(1), cursor.getColumnName(3), cursor.getColumnName(2)};//массив столбцов, поля которых собираемся отображать
            int[] to = new int[]{R.id.tvName, R.id.tvPrice, R.id.tvModel};                          //Массив View-компонентов для отображения этих стобцов
            SimpleCursorAdapter sCursorAdapter = new SimpleCursorAdapter(this, R.layout.item_listview, cursor, from, to, 0);//Создал адаптер и настроил ему кастомный вид
            lv_findModels.setAdapter(sCursorAdapter);                                               //Повесил адаптер
            dbHelper.close();                                                                       //Закрыл подключение к БД
        }
        else{
            LinearLayout liner = (LinearLayout) findViewById(R.id.liner);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            TextView tv = new TextView(this);
            tv.setText("По заданным параметрам ничего не найдено.");
            tv.setTextSize(22);
            tv.setGravity(Gravity.CENTER);
            liner.addView(tv, params);        }
    }
}
Миниатюры
Сложный запрос из БД  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.10.2017, 15:34
Ответы с готовыми решениями:

сложный запрос (для меня сложный)
Есть таблица с продажами услуг от разных фирм, есть таблица с оплатой за предоставленные услуги (при этом сумма оплат может не совпадать с...

Сложный запрос
Здравствуйте!у меня есть БД: Успеваемость(#Nз, #ИдКурса, #Семестр, #УчНед, #ВидОтчета, Оценка) ОтчетГруппы(#ИдКурса, #Nгр, #УчНед,...

Сложный запрос
Помогите прочитать код , совсем не могу понять как проходит проверка ответа. quest.php &lt;? error_reporting(E_ALL); ...

3
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
12.10.2017, 18:40
Nakiii, когда идут перечисления, то нужно использовать конструкцию с IN
Например, есть такая таблица
SQL
1
CREATE TABLE tablets (brand STRING, price REAL, YEAR INTEGER, os STRING, os_version STRING);
В ней лежат такие данные
SQL
1
INSERT INTO tablets (brand, price, YEAR, os, os_version) VALUES ('Digma', 1000, 2015, 'Android', '4.4 KitKat'), ('Lenovo', 8000, 2014, 'Android', '4.4 KitKat'), ('Asus', 10000, 2015, 'Android', '6.0 Marshmallow'), ('Asus', 12000, 2015, 'Android', '7.0 Nougat');
И такой запрос
SQL
1
SELECT * FROM tablets WHERE brand [B]IN ('Asus','Lenovo')[/B] AND price <= 10000
Отдаст

Lenovo | 8000 | 2014 | Android | 4.4 KitKat
Asus | 10000 | 2015 | Android | 6.0 Marshmallow
0
1 / 1 / 0
Регистрация: 15.11.2015
Сообщений: 88
12.10.2017, 20:05  [ТС]
В вашем запросе оператор AND не позволит мне не указывать цену. Т.е. я буду обязан указать и Бренд и Цену - только в этом случае будет выполнен запрос.
А если мне Бренд вообще не важен и я хочу указать только цену. Например указал цену до 10000р - мне выдало несколько планшетов.
Потом решил, что пусть это будут только Асусы, указал этот бренд - и мне уже другой результат выдало (Только Асусы стоимостью до 10000р).
Вот как я хочу организовать принцип работы приложения.
0
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
13.10.2017, 15:29
Nakiii, в чем проблема?
Далее псевдокод смешанный с кодом:
String query = "SELECT * FROM tablets"
Собираем все условия
List<String> where = new ArrayList();

if(Выбран хоть один бренд){
String whereBrand = " brand IN ("
for(Бренд : выбранные бренды)
whereBrand += "'Бренд',"
удалить последную запятую в строке
whereBrand += ")"
where.add(whereBrand)
}

if(если указана цена){
String wherePrice = "условия по цене"
where.add(wherePrice)
}

if(если указан любой другой параметр){
String whereWhatever = "условия по любому другому параметру"
where.add(whereWhatever)
}

Собираем строку выборки

String queryWhere = null
for(String param : where){
queryWhere += param + " AND ";
}
удалить последний AND запятую в строке
query + query == null ? "" : "WHERE "+queryWhere
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.10.2017, 15:29
Помогаю со студенческими работами здесь

Сложный запрос
Помогите составить запрос который вернет N товаров принесшых максимальную прибыль(разница мжду ценой закупки и продажи) за произвольный...

Сложный запрос
Помогите сделать запрос, в котором участвует несколько таблиц. Я объединяю с помощью INNER JOIN 4 таблицы, плюс одну таблицу LEFT JOIN......

Сложный запрос
Добрый день! Столкнулся с тем что нужно сделать SQL запрос к базе Accsess 2013 И прошу помощи, так как не особо умею писать сложные...

сложный запрос
Есть таблица А: id | date | number, id - int date - datetime number - int, 0, 1 или 2 Необходим запрос в табл А, где...

Сложный запрос
Всем привет! Подскажите пожалуйста, как реализовать следующее. В базе есть перечень таблиц, в которых различные поля, но есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru