Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / запрос из двух таблиц / 8 сообщений из 8, страница 1 из 1
21.04.2016, 11:38
    #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
21.04.2016, 17:34
    #39221587
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос из двух таблиц
Помещаешь подзапрос в список полей главного запроса. Все.
...
Рейтинг: 0 / 0
21.04.2016, 18:46
    #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
21.04.2016, 20:01
    #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
22.04.2016, 16:12
    #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
23.04.2016, 16:38
    #39223091
fanlis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос из двух таблиц
Вот теперь я не понял. Что это за переменные? max от чего?
...
Рейтинг: 0 / 0
26.04.2016, 08:36
    #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
26.04.2016, 11:51
    #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
Форумы / SQLite [игнор отключен] [закрыт для гостей] / запрос из двух таблиц / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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