На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> запрос из двух таблиц , помогите составить
    Здравствуйте!
    Я только начал изучать sql, а точнее программирование под андроид. Использую sqlite.
    Такая база:
    ExpandedWrap disabled
      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...)
    На экране в моей программе я вижу список элементов групп, нажимая на элемент, я попадаю на экран, где ввожу данные. После ввода возвращаюсь к списку. И там я должен увидеть, что для определенной группы я сегодня ввел данные, т.е. какую-нибудь маркировку. Но это предисловие.

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

    Но это без маркировки. Чтобы сделать маркировку, я хочу в запросе получать кроме тех полей, что я ввел еще одно поле, в котором будет значение (флаг,признак), что в таблице data есть запись с сегодняшней датой для заданного элемента. Я попробовал сделать что-то типа того:
    ExpandedWrap disabled
      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.
      Поля таблицы exercise надо перенести из фильтра в условие связи. Но там есть параметер. Я не знаю как ето заимплементировать в SqlLite

      ExpandedWrap disabled
        ... on exercise._id = data.up AND parent = ?  WHERE  visiblity = 1 ...
        Сделал так:
        ExpandedWrap disabled
          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 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0270 ]   [ 15 queries used ]   [ Generated: 19.04.24, 12:58 GMT ]