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

    erge
    @erge
    Примус починяю
    Потому что у вас не задан альяс колонки для подзапроса
    (SELECT DISTINCT(Name) AS storekeeperName FROM User, Waybill WHERE (Waybill.loginStorekeeper = User.login))


    укажите альяс через AS

    например:
    SELECT
        Waybill.Id, Waybill.IMO, Vessel.Name, Waybill.loginManager, User.Name, Waybill.loginStorekeeper,
        (SELECT DISTINCT(Name) AS storekeeperName FROM User, Waybill WHERE (Waybill.loginStorekeeper = User.login))  AS storekeeperName,
        Waybill.Date 
      FROM Waybill, Vessel, User 
      WHERE (Waybill.IMO = Vessel.IMO)
        AND (Waybill.loginManager = User.Login)
        AND (Waybill.loginManager = User.Login)
      ORDER BY Waybill.Id


    PS: скобки в условии не обязательны и без них сначала выполняется оператор = а затем AND
    Ответ написан
    Комментировать
  • Как сформировать sql запрос для выборки из двух таблиц?

    erge
    @erge
    Примус починяю
    SELECT t1.*
      FROM t1
      JOIN t2 ON t2.id_iz_pervoi_tablici = t1.id
      WHERE t2.flag = 0
    Ответ написан
    Комментировать
  • Запрос по двум таблицам PostgresSQL?

    erge
    @erge
    Примус починяю
    SELECT id FROM (
      SELECT id FROM tbl1
      UNION
      SELECT id FROM tbl2 WHERE is_active = 1
    ) WHERE id = SOME_ID
    Ответ написан
    Комментировать
  • Как получить данные из 2 таблиц по разным условиям?

    erge
    @erge
    Примус починяю
    SELECT *
      FROM setting_salue sv
      JOIN setting s ON s.id = sv.setting_id
      WHERE (sv.domain_id = DOMAIN_ID OR sv.domain_id IS NULL)
        AND (sv.language_id = LANG_ID OR sv.language_id IS NULL)
    Ответ написан
    5 комментариев
  • Как найти телефон в sql с помощью match against?

    erge
    @erge
    Примус починяю
    UPD:
    немного неверно написал ранее, т.к. это поиск по части номера, то естественно надо LIKE
    $sql = "SELECT * FROM tbl WHERE replace(replace(replace(replace(phone,'(',''),')',''),' ',''),'-','') LIKE concat(replace(replace(replace(replace('".$num."','(',''),')',''),' ',''),'-',''), '%')";


    UPD2:
    PS:
    Не совсем понимаю как это реализовать с помощь полнотекстового поиска.

    а зачем вообще реализовывать это с помощью полнотекстового поиска??
    если номер телефона хранится в отдельном поле, в определенном формате?
    1. либо приводите обе стороны "искомого" к одному формату (т.е. удаляете все лишнее) как например выше.
    2. либо, если номера в базе хранятся в одном формате приводите искомый (вводимый) номер к формату хранения в базе + знак % и поиск LIKE
    3. либо делаете поиск через REGEXP соответствующим образом формируя рег.выражение из PHP
      но это несколько сложнее, надо ее динамически формировать в зависимости от введенных цифр.
      вот регулярка для проверки телефона практически в любом варианте написания:
      ^\+?7[ -]?\(?\d{3}\)?[ -]?\d{3}[ -]?\d{2}[ -]?\d{2}$

      под MySQL сами перепишите... см. ссылку выше, там другие классы символов.
    4. либо, если все же таки нужен полнотекстовый поиск, то искомое значение НЕОБХОДИМО приводить к формату в базе и искать отформатированное значение
    Ответ написан
    Комментировать
  • Как исправить ошибку при выводе из 2-х таблиц?

    erge
    @erge
    Примус починяю
    1. а если INNER JOIN ?

    SELECT `zadachi`.id AS id_zadacha,`zadachi`.*,`users`.* 
      FROM `zadachi`
      INNER JOIN `users` ON `users`.id_1c = `zadachi`.autor
      WHERE `zadachi`.komy = '$id' OR (`zadachi`.autor = '$id' AND `zadachi`.komy = '$id') 
      ORDER BY `zadachi`.id DESC


    2.
    а: Группа новых задач...
    б: Группа просроченных задач...
    в: Группа поставленных задач кому то...


    3 запроса, объединить через UNION ALL
    типа
    SELECT 'NEW' as group, .... FROM ... 
    UNION ALL
    SELECT 'EXPIRED' as group, ... FROM ...
    UNION ALL
    SELECT 'OTHER' as group, ... FROM ...
    Ответ написан
  • Как вывести факт отсутствия данных?

    erge
    @erge
    Примус починяю
    Необходимо в приложении заложить правильную логику, либо обработку количества записей, либо с эксепшн.
    а по вопросу - FULL OUTER JOIN
    -- выбираем несуществующую запись
    SELECT pt.pid, t.id, t.text FROM (SELECT 1 AS pid) pt
      FULL OUTER JOIN (
        SELECT 1 AS pid, tt.*
          FROM tbl tt
          -- условие запроса:
          WHERE tt.id = 10
      ) AS t ON pt.pid = t.pid
    ;

    см. пример на dbfiddle

    так же и LEFT OUTER JOIN, но условие по запросу ставить внутрь скобок ( ) в подзапрос, см dbfiddle:
    -- выбираем несуществующую запись
    SELECT pt.pid, t.id, t.text FROM (SELECT 1 AS pid) pt
      LEFT OUTER JOIN (
        SELECT 1 AS pid, tt.*
          FROM tbl tt
          -- условие запроса:
          WHERE tt.id = 10
      ) AS t ON pt.pid = t.pid
    ;


    можно еще UNION подзапроса с NULL , но он всегда будет вставляться.
    SELECT id, text FROM tbl
    WHERE id = 10
    UNION
    SELECT NULL, NULL
    ;


    пример там же, выше.
    Ответ написан
    Комментировать
  • Как объединить подзапросы?

    erge
    @erge Автор вопроса
    Примус починяю
    PS: извиняюсь, поспешил, таки пропустил... по параметрам что выбрал, оба запроса были пустые.

    Все работает:

    SELECT
        DECODE(NVL(an.id,0), 0,ao.id, an.id) AS id,
        DECODE(NVL(an.id,0), 0,ao.dt_beg, an.dt_beg) AS dt_beg,
        DECODE(NVL(an.id,0), 0,ao.dt_end, an.dt_end) AS dt_end
      FROM
      (.....) ao
      FULL OUTER JOIN (.....) an ON ao.id = an.id
      WHERE (an.id is null OR ao.id is null)
        AND (ao.id = _NUMBER_ OR an.id = _NUMBER_)
    ;
    Ответ написан
    Комментировать
  • Почему не редактируются данные в БД?

    erge
    @erge
    Примус починяю
    первичный ключ, которым должен быть по идее id, у вас не указан как primary key, во все строках равен 0 - почему!?

    необходимо поле id сделать первичным ключем, но прежде необходимо либо удалить все строки, либо в каждой строке прописать id инкрементально.

    правда все строки у вас идентичные и их никак не различить...
    поэтому можно сделать так:

    set @i = 0;
    
    update `grey_csgo_gifts_list`
      set id = @i := @i + 1;
    
    alter table `grey_csgo_gifts_list` modify `id` int(11) auto_increment primary key;


    см. пример на dbfiddle
    Ответ написан
    Комментировать
  • Два переноса строки и как написать update с использованием REPLACE sql?

    erge
    @erge
    Примус починяю
    • зачем вы знак % вставляете?
      PS: знак % работает только в LIKE
    • строка должна заключаться в ' ' (одинарные кавычки), хотя для MySQL может это и не критично
    • вы точно хотите 3 тэга заменить на 1 ?
    • имхо, это вообще не критично - 2 переноса строки, или это требование по феншую? ))


    Все работает
    select
        replace(
           text
          ,CONCAT('</table>', CHAR(10), CHAR(10),'</li>',CHAR(10),'</ul>')
          , '</table>'
        ) as text
      from tbl;
    
    set @a = CONCAT('</table>', CHAR(10), CHAR(10),'</li>',CHAR(10),'</ul>');
    
    update tbl
      set text = replace(text, @a, '</table>');


    пример на sqlfiddle

    UPD:

    Solodukha,
    Если update не обрабатывает строки, это значит только одно:
    • что там переносы строк не CHR(10), либо посмотрите какие там переносы, либо попробуйте CHR(10), CHR(13) = Это один перенос строки (либо наоборот), либо еще как вариант, только CHR(13),
    • либо.. скорее всего после </table> или в тэгах есть побельные символы (пробел, табуляция и пр.) и/или "белые пробелы".


    (но нам то это неизвестно, данные у ВАС)


    Поэтому:
    • Либо разбор текста будет более сложный, необходимо строчными функциями искать table внутри li , сабстринг и пр. что как бы заморочно, оформлять это скорее всего хранимой процедурой.
    • Либо писать скрипт на чем угодно (bash, php, perl, python ... etc), выбирать записи и построчно: обрабатывать регуляркой, записывать обратно в бд.
    • Либо, ЕСЛИ у вас MySQL 8, все это можно сделать в БД, одним запросом используя REGEXP_REPLACE():

      примерно так:
      update tbl
        set text = REGEXP_REPLACE(
           text
          ,'<[[:blank:][:space:]]*\/table>[[:blank:][:space:]]+<[[:blank:][:space:]]*\/li>[[:blank:][:space:]]+<[[:blank:][:space:]]*\/ul>[[:blank:][:space:]]*'
          ,'</table>'
          )

      см. на dbfiddle



    другого, имхо, не дано...
    Ответ написан
    7 комментариев
  • Сортировка по просмотрам за день / неделю / месяц - как построить запрос?

    erge
    @erge
    Примус починяю
    Примерно, как-то так, если не ошибаюсь:

    SELECT
          `ID`
        , `post_title`
        , pv30.cnt_month
        , COALESCE(pv7.cnt_week, 0) cnt_week
        , COALESCE(pv1.cnt_day, 0) cnt_day
      FROM `wp_posts` AS p
      INNER JOIN (
        SELECT id, count(id) cnt_month
          FROM `wp_post_views` pv
          WHERE pv.time >= CURDATE() - INTERVAL 30 DAY
          GROUP BY pv.id
        ) AS pv30
        ON pv30.id = p.id
      LEFT JOIN (
        SELECT id, count(id) cnt_week
          FROM `wp_post_views` pv
          WHERE pv.time >= CURDATE() - INTERVAL 7 DAY
          GROUP BY pv.id
        ) AS pv7
        ON pv7.id = p.id
      LEFT JOIN (
        SELECT id, count(id) cnt_day
          FROM `wp_post_views` pv
          WHERE pv.time >= CURDATE() - INTERVAL 1 DAY
          GROUP BY pv.id
        ) AS pv1
        ON pv1.id = p.id
      ORDER BY pv30.cnt_month DESC, pv7.cnt_week DESC, pv1.cnt_day DESC
      LIMIT 10;
    Ответ написан
    1 комментарий
  • Ошибка преобразования массовой загрузки данных?

    erge
    @erge
    Примус починяю
    Importing data from a CSV file

    BULK INSERT LR1.dbo.Company
    FROM '\\Mac\Home\Descktop\DB\data\Company.txt'
    WITH (FORMAT = 'CSV'
          , FIRSTROW=1
          , FIELDTERMINATOR = ';'
          , ROWTERMINATOR = '0x0a');


    PS: так же попробуйте с , FIELDQUOTE = '\''
    хотя в этом случае кажется каждое значение должно быть в апострофах, а не только строки.

    Так же попробуйте указать CODEPAGE
    Ответ написан
    Комментировать
  • Как сделать дамп большой базы в Mysql на Windows?

    erge
    @erge
    Примус починяю
    Не 7zFM.exe а 7z.exe

    Первый это оконный файловый менеджер, второй работает из командной строки

    см. опции и ключи запуска:

    7-Zip 19.00 (x86) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

    Usage: 7z [...] [...] [@listfile]


    a : Add files to archive
    b : Benchmark
    d : Delete files from archive
    e : Extract files from archive (without using directory names)
    h : Calculate hash values for files
    i : Show information about supported formats
    l : List contents of archive
    rn : Rename files in archive
    t : Test integrity of archive
    u : Update files to archive
    x : eXtract files with full paths


    -- : Stop switches and @listfile parsing
    -ai[r[-|0]]{@listfile|!wildcard} : Include archives
    -ax[r[-|0]]{@listfile|!wildcard} : eXclude archives
    -ao{a|s|t|u} : set Overwrite mode
    -an : disable archive_name field
    -bb[0-3] : set output log level
    -bd : disable progress indicator
    -bs{o|e|p}{0|1|2} : set output stream for output/error/progress line
    -bt : show execution time statistics
    -i[r[-|0]]{@listfile|!wildcard} : Include filenames
    -m{Parameters} : set compression Method
    -mmt[N] : set number of CPU threads
    -mx[N] : set compression level: -mx1 (fastest) ... -mx9 (ultra)
    -o{Directory} : set Output directory
    -p{Password} : set Password
    -r[-|0] : Recurse subdirectories
    -sa{a|e|s} : set Archive name mode
    -scc{UTF-8|WIN|DOS} : set charset for for console input/output
    -scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files
    -scrc[CRC32|CRC64|SHA1|SHA256|*] : set hash function for x, e, h commands
    -sdel : delete files after compression
    -seml[.] : send archive by email
    -sfx[{name}] : Create SFX archive
    -si[{name}] : read data from stdin
    -slp : set Large Pages mode
    -slt : show technical information for l (List) command
    -snh : store hard links as links
    -snl : store symbolic links as links
    -sni : store NT security information
    -sns[-] : store NTFS alternate streams
    -so : write data to stdout
    -spd : disable wildcard matching for file names
    -spe : eliminate duplication of root folder for extract command
    -spf : use fully qualified file paths
    -ssc[-] : set sensitive case mode
    -sse : stop archive creating, if it can't open some input file
    -ssw : compress shared files
    -stl : set archive timestamp from the most recently modified file
    -stm{HexMask} : set CPU thread affinity mask (hexadecimal number)
    -stx{Type} : exclude archive type
    -t{Type} : Set type of archive
    -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : Update options
    -v{Size}[b|k|m|g] : Create volumes
    -w[{path}] : assign Work directory. Empty path means a temporary directory
    -x[r[-|0]]{@listfile|!wildcard} : eXclude filenames
    -y : assume Yes on all queries


    так же смотрите - mysql, Утилита командной строки

    но подозреваю, что все равно не получится, надо указывать какой конкретно файл распаковывать и кидать в stdout, потому что распаковаться могут не в том порядке как надо.

    как-то так наверно:
    "C:\Program Files (x86)\7-Zip\7z.exe" x -so G:\FIAS\fias_07.10.19.zip sql_file1.sql | G:\MySqlWork\mysql.exe -uroot -p 4830 newBase
    "C:\Program Files (x86)\7-Zip\7z.exe" x -so G:\FIAS\fias_07.10.19.zip sql_file2.sql | G:\MySqlWork\mysql.exe -uroot -p 4830 newBase


    и так перебрать все по порядку.
    Ответ написан
  • Как создать таблицу где записи соответствуют записям из старой таблицы?

    erge
    @erge
    Примус починяю
    создать дуликат таблицы:
    CREATE TABLE users2 [AS] SELECT * FROM users;

    вставить строки:
    INSERT IGNORE
        INTO users2 (id_user, name, ................)
    SELECT
        id_user, name, ..................
    FROM
        users
    Ответ написан
    Комментировать
  • Возможно ли в одной выборке вывести несколько COUNT`ов с условием?

    erge
    @erge
    Примус починяю
    а взять и просто написать, вместо того чтобы спрашивать?
    COUNT не считает NULL
    SELECT
        key,
        count(DECODE(value, 'tino',1, NULL)) AS tino,
        count(DECODE(value, 'tipo',1, NULL)) AS tipo,
        count(DECODE(value, 'tiko',1, NULL)) AS tiko
      FROM table1
      GROUP BY key


    см. на sqlfiddle
    Ответ написан
    Комментировать
  • Как написать запрос для выбора связей без дубликатов PostgreSQL?

    erge
    @erge
    Примус починяю
    SELECT 
      t2.b1,
      t2.b2,
      t2.b3,
      ARRAY_AGG(t2.value)
    FROM table2 t2
    WHERE EXISTS (
      SELECT 1
        FROM table1 t1
        WHERE t1.a1 = t2.b1
          AND t1.a2 = t2.b2
          AND t1.a3 = t2.b3
    )
    GROUP BY t2.b1, t2.b2, t2.b3


    PS:
    Подскажите пожалуйста, как в колонке array_agg получить уникальные значения (в виде массива)

    вообще-то они не уникальные и я так понимаю вопрос должен был звучать как-то типа:
    как из table2 выбрать значения по трем ключам связям с table1 и агрегировать колонку value в "массив"?
    Ответ написан