powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / запрос из двух таблиц
8 сообщений из 8, страница 1 из 1
запрос из двух таблиц
    #39221031
fanlis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Я только начал изучать sql, а точнее программирование под андроид. Использую sqlite.

Такая база:
Код: sql
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.
BEGIN TRANSACTION;
CREATE TABLE exercise (_id integer primary key autoincrement,name text,parent integer);
CREATE TABLE data (_id integer primary key autoincrement,pod integer, up integer, adate integer, weight real, repeat integer);
INSERT INTO "exercise" VALUES(1,'Понедельник',0);
INSERT INTO "exercise" VALUES(2,'Группа 1',1);
INSERT INTO "exercise" VALUES(3,'ааа',2);
INSERT INTO "exercise" VALUES(4,'ббб',2);
INSERT INTO "exercise" VALUES(5,'ввв',2);
INSERT INTO "exercise" VALUES(6,'Группа 2',1);
INSERT INTO "exercise" VALUES(8,'ццц',6);
INSERT INTO "data" VALUES(9,1,3,1459137600,5.0,10);
INSERT INTO "data" VALUES(10,2,3,1459137600,7.5,10);
INSERT INTO "data" VALUES(11,3,3,1459137600,10.0,8);
INSERT INTO "data" VALUES(12,4,3,1459137600,12.5,8);
INSERT INTO "data" VALUES(13,5,3,1459137600,15.0,6);
INSERT INTO "data" VALUES(14,1,4,1459137600,1.25,10);
INSERT INTO "data" VALUES(15,2,4,1459137600,2.5,10);
INSERT INTO "data" VALUES(16,3,4,1459137600,3.75,10);
INSERT INTO "data" VALUES(17,4,4,1459137600,5.0,10);
INSERT INTO "data" VALUES(18,1,3,1459742400,5.0,10);
INSERT INTO "data" VALUES(19,2,3,1459742400,7.5,10);
INSERT INTO "data" VALUES(20,3,3,1459742400,10.0,10);
INSERT INTO "data" VALUES(21,4,3,1459742400,12.5,10);
INSERT INTO "data" VALUES(22,5,3,1459742400,15.0,8);
INSERT INTO "data" VALUES(23,1,4,1459742400,2.5,10);
INSERT INTO "data" VALUES(24,2,4,1459742400,3.75,10);
INSERT INTO "data" VALUES(25,3,4,1459742400,5.0,10);
INSERT INTO "data" VALUES(26,4,4,1459742400,6.25,10);
INSERT INTO "data" VALUES(27,1,3,1460347200,83.75,10);
INSERT INTO "data" VALUES(28,2,3,1460347200,7.5,10);
INSERT INTO "data" VALUES(29,3,3,1460347200,11.0,10);
INSERT INTO "data" VALUES(30,4,3,1460347200,12.5,10);
INSERT INTO "data" VALUES(31,5,3,1460347200,17.5,10);
INSERT INTO "data" VALUES(32,1,4,1460347200,3.75,10);
INSERT INTO "data" VALUES(33,2,4,1460347200,5.0,10);
INSERT INTO "data" VALUES(34,3,4,1460347200,6.25,10);
INSERT INTO "data" VALUES(35,4,4,1460347200,7.5,10);
INSERT INTO "data" VALUES(39,6,3,1460347200,25.0,1);
INSERT INTO "data" VALUES(40,7,3,1460347200,375.0,1);
COMMIT;


Длинное число (1460347200) - это дата.
Смысл в том, что для каждого дня недели есть набор групп, в каждой группе - набор элементов. Для каждого элемента я задаю набор параметров, которые хранятся в таблице data и нумеруются полем pod (1,2,3...)
На экране в моей программе я вижу список элементов групп, нажимая на элемент, я попадаю на экран, где ввожу данные. После ввода возвращаюсь к списку. И там я должен увидеть, что для определенной группы я сегодня ввел данные, т.е. какую-нибудь маркировку. Но это предисловие.

чтобы увидеть список, я делаю запрос:
Код: java
1.
2.
String sql = "SELECT id, name, visiblity FROM exercise WHERE parent = ? AND visiblity = 1;
db.rawQuery(sql, new String[] { Integer.toString(id) });


Но это без маркировки. Чтобы сделать маркировку, я хочу в запросе получать кроме тех полей, что я ввел еще одно поле, в котором будет значение (флаг,признак), что в таблице data есть запись с сегодняшней датой для заданного элемента. Я попробовал сделать что-то типа того:
Код: java
1.
2.
 String sql = "SELECT exercise._id, name, adate FROM exercise LEFT OUTER JOIN data on exercise._id = data.up WHERE parent = ? AND visiblity = 1 AND (pod = 1 OR podhod is null) AND (adate = ? OR adate is null)";
db.rawQuery(sql, new String[] { Integer.toString(id), Integer.toString(tekDate) });


Таким образом я хотел получить список элементов заданной группы (_id, name) и еще поле adate с сегодняшней датой или null, если ее нет. Но получилось не то. В принципе мне не важно, что будет в поле adate: дата или null, 0 или 1, или еще что-то, главное чтобы это трактовать как true или false.
...
Рейтинг: 0 / 0
запрос из двух таблиц
    #39221587
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помещаешь подзапрос в список полей главного запроса. Все.
...
Рейтинг: 0 / 0
запрос из двух таблиц
    #39221691
fanlis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так что ли? Не пойму.
Код: java
1.
2.
3.
String subsql = "SELECT adate from data WHERE pod = 1 AND adate = " + tekDate;
String sql = "SELECT id, name, visiblity, " + subsql + " FROM exercise WHERE parent = ? AND visiblity = 1;"
db.rawQuery(sql, new String[] { Integer.toString(id) });


а как потом ее из курсора-то вытащить? По названию поля adate?
...
Рейтинг: 0 / 0
запрос из двух таблиц
    #39221760
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fanlisтак что ли? Не пойму.
Код: java
1.
2.
3.
String subsql = "SELECT adate from data WHERE pod = 1 AND adate = " + tekDate;
String sql = "SELECT id, name, visiblity, " + subsql + " FROM exercise WHERE parent = ? AND visiblity = 1;"
db.rawQuery(sql, new String[] { Integer.toString(id) });


а как потом ее из курсора-то вытащить? По названию поля adate?Никаких курсоров, подзапрос обязан вернуть только одно значение. И ты забыл скобки.
Код: sql
1.
select t1.f1, t1.f2, (select max(t2.f) from t2 where t2.pk=t1.fkey) as max_t2_f from t1
...
Рейтинг: 0 / 0
запрос из двух таблиц
    #39222650
pand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так, мне кажется , будет оптимальнее

Код: sql
1.
2.
3.
select t1.f1, t1.f2,  max(t2.f)  as max_t2_f
 from t1 left outer join  t2 on t2.pk=t1.fkey
group by  t1.f1, t1.f2
...
Рейтинг: 0 / 0
запрос из двух таблиц
    #39223091
fanlis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот теперь я не понял. Что это за переменные? max от чего?
...
Рейтинг: 0 / 0
запрос из двух таблиц
    #39224380
fanlis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал так:
Код: java
1.
2.
3.
String SUBSQL = "(SELECT adate from data WHERE exercise._id = data.up " + "AND pod = 1 AND adate = " + Integer.toString(tekDate) + ")";
String SQL = "SELECT _id, name, visiblity, " + SUBSQL + " as dat FROM exercise WHERE parent = ? AND visiblity = 1;";
db.rawQuery(SQL, new String[] { Integer.toString(id) });


поле dat возвращает либо текущую дату (тогда я понимаю, что она есть), либо null (тогда я понимаю, что ее нет).
...
Рейтинг: 0 / 0
запрос из двух таблиц
    #39224585
pand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fanlisСделал так:
Код: java
1.
2.
3.
String SUBSQL = "(SELECT adate from data WHERE exercise._id = data.up " + "AND pod = 1 AND adate = " + Integer.toString(tekDate) + ")";
String SQL = "SELECT _id, name, visiblity, " + SUBSQL + " as dat FROM exercise WHERE parent = ? AND visiblity = 1;";
db.rawQuery(SQL, new String[] { Integer.toString(id) });


поле dat возвращает либо текущую дату (тогда я понимаю, что она есть), либо null (тогда я понимаю, что ее нет).

Код: sql
1.
2.
3.
4.
SELECT e._id, e.name, e.visiblity, 
d.adate  as dat 
FROM exercise e  left outer join data d on  e._id = d.up AND d.pod = 1 AND d.adate =  +  Integer.toString(tekDate) +
 WHERE parent = ? AND visiblity = 1 ; 



можно и так написать ( + Integer.toString(tekDate) + только правильно оформите в строку ) зачем вставлять вложенный запрос .
и в этом запросе даты у Вас должны совпадать до милисекунды , как я понял .
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / запрос из двух таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]