Задать вопрос
Ответы пользователя по тегу SQL
  • Как мог бы выглядеть такой запрос?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    ... group by car_id
    Ответ написан
    Комментировать
  • Как выбрать id для которых в таблице есть только одна запись?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    select goods_id from tablename where goods_id in (?) group by goods_id having count(*)=1
    Ответ написан
  • Как сделать временную таблицу с одинаковыми данными?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    небольшая ремарка №3: а нафига вам вообще cross join понадобился?
    SELECT 'Economy' FROM generate_series(1,10);
    Ответ написан
    1 комментарий
  • Как выгрузить из бэкапа нескольких БД одну необходимую?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Как выгрузить из бэкапа нескольких БД одну необходимую?

    бэкап всех БД - all_databases.sql

    Никак.
    Либо идти руками и текстовым редактором доставать именно нужное.

    -U - существующий в postgresql пользователь, от имени которого можно зайти сейчас. А не после разворачивания бекапа. Для бекапа всего кластера очевидно понадобится суперпользователь, postgres или pgsql обычно.
    -d имя базы данных, а не таблицы. База так же должна уже существовать, чтобы можно было подключиться к pg.
    Ответ написан
  • Как написать SQL запрос?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Errcode 28 = нет места на диске. (или инодов)

    Не очень понял, зачем вам concat понадобился.
    SELECT
      COUNT(DISTINCT `offer`) AS `cnt`,
      `webmaster`, `partner`
    FROM `orders`
    GROUP BY `webmaster`, `partner`
    HAVING `cnt` > 1
    Ответ написан
    Комментировать
  • Правильно ли использовать LOCK TABLES READ для сохранения целостности данных в этом случае?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    insert_id будет неправильный

    Невозможно. На любой интенсивность записи. Значение last insert id сессионное, а не глобальное.

    Оберните в транзакцию - тогда до коммита никто и не увидит частично записанную транзакцию. Если говорить о транзакционных вещах, конечно, а не каких-нибудь myisam.
    Ответ написан
  • Что значит ошибка 1064 в MySQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Посмотрите в консольке.

    И из очевидного:
    WHERE `rooms`.`id_room` = `accommodation`.`id_room`

    Парсер не поймёт, что такое accommodation. Если вы хотели написать про обновляемые строку, которая спровоцировала вызов этого триггера - то для этого есть NEW и OLD псевдостроки.
    Ответ написан
  • Sql like golang?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Знаки % должны быть именно в данных. Поэтому либо на стороне приложения добавляете по краям строки %
    Либо на стороне sql собираете:
    db.Query("SELECT * FROM `page` WHERE `title` LIKE concat('%', ?, '%')", q)
    Ответ написан
  • Почему не хочешь создаватся таблица?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Детали, почему не удалось повесить внешний ключ можно найти в "логичном и очевидном" месте: в выводе команды SHOW ENGINE INNODB STATUS, есть кусочек текста LATEST FOREIGN KEY ERROR.

    Частые ошибки - в одной таблице поле int, в другой unsigned int. Это разные, несовместимые типы, ага.
    Ответ написан
    1 комментарий
  • Как написать запрос?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Никак.
    Глупый mysql не умеет рекурсивные запросы.

    на выбор:
    - меняете структуру хранения. nested sets или материализованный путь, например
    - вытягиваете всё на приложение и строите там
    - делаете МНОГО запросов
    - пишете хранимку, которая будет делать много запросов
    - если вложенность известна - то через n джойнов можно.
    Ответ написан
    2 комментария
  • Как в sql запросе узнать номер записи при сортировке по какому-то параметру?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    На каком месте пользователь в рейтинге?
    На том, сколько народу перед ним.
    select count where score < (select score where id = :curuser)
    Ответ написан
    1 комментарий
  • Где ошибка в запросе?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Если вы не указываете, как сравнивать строки таблиц между собой - вы получите декартово произведение. Каждая строка сджойнится с каждой.

    Если вы хотите вывести все данные из обеих таблиц с отметками, что есть только в первой, что только во второй, а что в обеих - вам нужен full join с объединением по этому полю.
    select table1.items, table2.items from table1 full join table2 using(items)
    Ответ написан
    Комментировать
  • Как провести insert, если одно из вставляемых значений нужно найти с помощью SELECT?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    insert into requests (file_id /*other*/) values((select id from tablename where name = ?) /*, other*/);

    NULL если строки не будет в подзапросе, ошибка - если их будет больше 1.

    insert into requests (file_id /*other*/) 
    select id, /* other const values*/ from tablename where name = ?;

    Если select даст 0 строк - ничего вставлено не будет.
    Одна или больше - столько новых строк и будет вставлено.
    Ответ написан
    Комментировать
  • Что лучше JOIN или использование нескольких таблиц в запросе?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    mysql> explain select test6.i from test6, test9 where test6.i=test9.i;
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                              |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    |  1 | SIMPLE      | test6 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL                                               |
    |  1 | SIMPLE      | test9 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    25.00 | Using where; Using join buffer (Block Nested Loop) |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    2 rows in set, 1 warning (0,00 sec)
    
    mysql> show warnings;
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Level | Code | Message                                                                                                                                 |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Note  | 1003 | /* select#1 */ select `test`.`test6`.`i` AS `i` from `test`.`test6` join `test`.`test9` where (`test`.`test9`.`i` = `test`.`test6`.`i`) |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0,00 sec)
    
    mysql> explain select test6.i from test6 join test9 on test6.i=test9.i;
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                              |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    |  1 | SIMPLE      | test6 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL                                               |
    |  1 | SIMPLE      | test9 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    25.00 | Using where; Using join buffer (Block Nested Loop) |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    2 rows in set, 1 warning (0,00 sec)
    
    mysql> show warnings;
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Level | Code | Message                                                                                                                                 |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Note  | 1003 | /* select#1 */ select `test`.`test6`.`i` AS `i` from `test`.`test6` join `test`.`test9` where (`test`.`test9`.`i` = `test`.`test6`.`i`) |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0,00 sec)

    Как можно заметить, оба стиля переписаны в одно и то же представление.

    Имеет смысл использовать join on по соображениям читаемости человеком, т.к. такой join сразу говорит, по каким полям связаны таблицы, а where органично остаётся для фильтрации.
    Плюс, в случае как у вас со связью по паре одноимённых полей можно написать
    SELECT maker, price FROM Product JOIN PC USING(model)

    Что эквивалентно PC.model = Product.model, но короче и позволяет в дальнейшем ссылаться просто на model - парсер уже знает, что значение поля будет идентично и не будет теряться в догадках, хотели вы получить model из PC или из Product
    Ответ написан
    Комментировать
  • Как в БД подставлять старые значения справочников?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Для начала между работником и учебным заведением связь многие-ко-многим.
    Во-вторых, с чего это для новых работников выбираются только новые значения? Можно быть одновременно новым работником и закончить лет *дцать назад именно бывшее тогда учебное заведение. Выбирать можно из всего списка, либо, что лучше, хранить для учебного заведения год открытия и год закрытия (default null) и выбирать подходящие по годам обучения.
    Если сохраняете ещё и даты обучения - то важно учесть, что учебное заведение может быть закрыто в любой момент между поступлением и выпуском студента. Поступил в одно заведение, выпустился из другого - запросто.

    Если нет особых требований к поиску учебных заведений, то достаточно хранить год закрытия (default null) и ссылку на новую форму после реорганизации, если есть (поэтому тоже default null).
    Для вашего примера будет КГПА например с edu_id = 105, reorg_to_id null и КГПУ со своим edu_id, датой закрытия и reorg_to_id = 105
    Ответ написан
    Комментировать
  • Как можно создать таблицу count-ов?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    select QuestionId, 
    sum(case when Value = 5 then 1 else 0 end) as '5'
    sum(case when Value = 4 then 1 else 0 end) as '4'
    sum(case when Value = 3 then 1 else 0 end) as '3'
    from tablename
    group by QuestionId


    Возможно ваша СУБД умеет выполнять операцию pivot.
    Ответ написан
    Комментировать
  • Почему незафиксированная транзакция может изменять данные?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Читайте далее. Это, судя по всему, прелюдия к описанию уровней изоляции транзакций.
    READ UNCOMMITTED - позволяет СУБД показывать данные, которые ещё не были зафиксированы. Это не значит, что именно так на этом уровне изоляции должна так себя вести СУБД, но поведение допускается стандартом для этого уровня изоляции. Например, в упомянутом postgresql на шаге t4 900 вы не сможете получить никогда, даже на read uncommitted.
    Ответ написан
    1 комментарий
  • SQL вставка текста в столбец перед нативным текстом, можно ли и как?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    "нативный текст" - это то, что в поле уже есть до выполнения запроса?

    update tablename set img_url = concat('/images/', img_url);
    Ответ написан
    2 комментария
  • Какую функцию агрегации использовать в запросе с GROUP BY?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Ожидал получить в выборке не более одной строки с каждым ref_id

    GROUP BY ref_id, id

    С чего бы это вы ожидали увидеть только один ref_id, если явно сказали затем группировать по id?
    С учётом названия и того, что postgresql в принципе согласился запрос выполнить - id является первичным ключом. А группировка по первичному ключу ожидаемо результат не изменит.

    select  distinct on (ref_id)  ref_id,  id,  created_at from tablename  order by ref_id, created_at desc;
    Ответ написан
    3 комментария