Ответы пользователя по тегу SQL
  • Как реализовать такой SQL-запрос по описанию?

    Судя по запросу у вас MySQL. Будь у меня Postgres, я бы воспользовался, например, возможностями CTE. В Мускуле такого нет, кажется, есть какие-то воркэраунды.

    Но можно банально и примитивно. Например, ответ на первый вопрос:
    SELECT * 
    FROM (
    	SELECT min(temperature) as min, max(temperature) as max, where_id, DATE_FORMAT(date,'%Y-%m-%d') as date from weather GROUP BY where_id, DATE_FORMAT(date,'%Y-%m-%d')
    ) AS data
    ORDER BY max - min DESC 
    LIMIT 1;


    В результате увидим дату, место и минимальную и максимальную температуру в этой точке за данный день.

    P.S.
    Можно и в один запрос:
    SELECT min(temperature) as minn, max(temperature) as maxx, where_id, DATE_FORMAT(date,'%Y-%m-%d') as date from weather GROUP BY where_id, DATE_FORMAT(date,'%Y-%m-%d')
    ORDER BY max(temperature) - min(temperature) DESC 
    LIMIT 1;


    P.P.S.
    Полный ответ на вопрос 1:
    SELECT 
      where_id, 
      (
        SELECT max(temperature) - min(temperature)
        FROM weather
        WHERE where_id = w1.where_id
        GROUP BY where_id, DATE_FORMAT(date,'%Y-%m-%d')
        ORDER BY max(temperature) - min(temperature) DESC
        LIMIT 1
      ) as diff,
      DATE_FORMAT(date,'%Y-%m-%d') as date
    FROM weather as w1
    WHERE id = (
      SELECT MAX(id)
      FROM weather
      WHERE where_id = w1.where_id
      GROUP BY where_id, DATE_FORMAT(date,'%Y-%m-%d')
      ORDER BY max(temperature) - min(temperature) DESC
      LIMIT 1
    )
    Ответ написан
  • Как работать с .db таблицами?

    ENGINE=InnoDB в вашем запросе относится к СУБД MySQL. В Sqlite такого не существует.
    Вообще, неплохо было бы включить корректную обработку ошибок, например, так:
    try {
        $dbh = new PDO("sqlite:database.db");
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $rows = $dbh->exec("...");
    } catch (PDOException $e) {
        echo 'Error: ' . $e->getMessage();
    }


    Ну и вообще воспользуйтесь SQLite3, если у вас PHP >=5.3
    Ответ написан
  • Как экранировать кавычки в Postgresql?

    Апостроф (одинарная кавычка) экранируется апострофом в SQL, т.е.
    WHERE c = ''''''
    * всего 6 апострофов.
    Ответ написан
    Комментировать