Задать вопрос
  • Возможно ли решить по другому вывод информации?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Сделать декомпозицию и рефакторинг вашего алгоритма:
    1. Берёте бумажку, ручку и рисуете весь алгоритм
    2. Разбиваете алгоритм на более простые элементы и так до самого простого элемента
    3. Переработать логику алгоритма для его упрощения, скомпоновав одинаковые части в блоки (функции), классы, модули, убрав не нужное, упростив там, где возможно и т.д. и т.п.
    4. Реализовать получившийся алгоритм в виде кода

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

    SQL запрос
    SELECT 
        gameName, 
        COUNT(DISTINCT memberID) AS totalUser
    FROM 
        game_sessions
    WHERE 
        guildid = ?
    GROUP BY 
        gameName
    ORDER BY 
        totalUser DESC
    LIMIT 10;

    Ответ написан
    Комментировать
  • Как удалить лишнее с БД mysql имея более 7000 id, которые удалять не надо?

    @rPman
    Тебе все ответили, тут два варианта - создавать в базе inmemory таблицу с одной колонкой и без индексов, и на ее основе уже делать
    DELETE FROM A WHERE A.id NOT IN (SELECT id FROM B);


    Либо написать скрипт, который выгрузит все id из базы, сравнит их (пока чисел не миллионы, это вообще не проблема) и сформирует список id которые нужно удалить (если всего 10к то их будет всего 3к), когда на десяток строк в любом языке программирования. Так как удаляются конкретные id то такой запрос будет работать быстрее чем delete where not in и возможно быстрее использования временной таблицы. Особых ограничений на количество id в where id in (...) я не нашел, если они есть то это проблема драйвера подключения к бд.

    Есть еще третий вариант, который потребует изменения всего проекта, но заложит неплохие возможности. В базе данных нужно определить флаг - deleted (boolean), который устанавливать true если запись нужно удалить, это может быть дополнительное поле в каждой таблице где это имеет смысл, либо отдельная таблица (это эффективнее, если удаленные записи долго не нужно хранить) с единственным полем id, куда будут складываться идентификаторы записей на удаление. Естественно все запросы проекта нужно будет модифицировать с учетом этого поля/таблицы, чтобы пропускались записи, помеченные на удаление. Реальное же удаление проводить в момент наименьшей нагрузки на сервер или по другому критерию (например удаленные записи можно хранить для использования, к примеру отчетности). У метода есть подводные камни - например уникальные индексы/ограничения на другие поля нужно так же переделывать на сдвоенные с флагом удаленности, чтобы допускались записи с тем же значением что и удаленные.
    Ответ написан
    1 комментарий
  • Как отловить нажатие на кнопку Discord.js?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    версия discord.js, которую вы используете (12.5.3), на данный момент устарела и больше официально не поддерживается.

    .createMessageComponentCollector() был добавлен в 13.0.0 версии, поэтому для использования нужно обновиться.
    чтобы это сделать, отправьте в терминал следующее:
    npm uninstall discord.js
    npm install discord.js

    также для обновления у вас должна быть версия node.js 16.6+.
    чтобы посмотреть текущую, node -v в терминал.

    насчет
    await message.channel.send(embed, { component: row });

    ...в последних версиях структура отправки сообщения была изменена и теперь выглядит немного по-другому:
    - message.channel.send(embed, { component: row });
    + message.channel.send({ embeds: [embed], components: [row] });

    обо всех изменениях: https://discordjs.guide/additional-info/changes-in...
    Ответ написан
    Комментировать
  • Как убрать фон который образуется при повороте картинки imagerotate()?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    $image = imagecreatefromstring(file_get_contents('test.jpg'));
    
    // получаем разеры исходника
    
    $ix = imagesx($image);
    $iy = imagesy($image);
    
    // делаем холст с заливкой фона
    
    $newimage = imagecreatetruecolor($ix, $iy);
    $transparent = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
    imagefill($newimage, 0, 0, $transparent);
    imagealphablending($newimage, true);
    imagesavealpha($newimage, true);
    
    // накладываем исходник на холст
    
    imagecopyresampled($newimage, $image, 0, 0, 0, 0, $ix, $iy, $ix, $iy);
    
    // берем вотермарку
    
    $imageW = imagecreatefromstring(file_get_contents('logo.png'));
    
    $wx = imagesx($imageW);
    $wy = imagesy($imageW);
    
    // для поворота нужен прозрачный холст
    
    $new = imagecreatetruecolor($wx, $wy);
    
    $transparent = imagecolorallocatealpha($new, 0, 0, 0, 127);
    $rotate = imagerotate($imageW, 45, $transparent);
    imagealphablending($rotate, true);
    imagesavealpha($rotate, true);
    
    // пересчет размеров после поворота
    
    $ix = imagesx($rotate);
    $iy = imagesy($rotate);
    
    // наложение 50 50 начало от левого верхнего угла
    
    imagecopyresampled($image, $rotate, 50, 50, 0, 0, $ix, $iy, $ix, $iy);
    
    // сохранение
    
    imagepng($image, 'testus.png', 9, PNG_ALL_FILTERS);

    5d2518ff9776c439694328.jpeg
    5d25190dbbe14223771085.png
    5d2519bb92a74841010101.png
    Ответ написан
    2 комментария
  • Вывод товаров по категориям учитывая вложенность, как сделать?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    $config = array(
        'host' => 'localhost',
        'name' => 'test',
        'user' => 'root',
        'pass' => '',
    );
    
    $pdo = new \PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['name'], $config['user'], $config['pass'],
        [
            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
            \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
            \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'",
            \PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,
        ]
    );
    
    $res = $pdo->query('select * from `products` order by `parent_id` asc');
    
    $cats = [];
    $structure = [];
    
    while ($row = $res->fetch()) {
        $cats[$row['id']] = $row;
        $structure[$row['parent_id']][] = $row['id'];
    }
    
    class Printer
    {
        private $cats = [];
        private $structure = [];
    
        public function __construct(array $cats, array $structure)
        {
            $this->setCats($cats);
            $this->setStructure($structure);
        }
    
        private function setCats(array $cats): void
        {
            $this->cats = $cats;
        }
    
        private function setStructure(array $structure): void
        {
            $this->structure = $structure;
        }
    
        protected function element(int $element): string
        {
            return '<a href="' . $this->cats[$element]['id'] . '">' . $this->cats[$element]['name'] . '</a>';
        }
    
        private function printElement(int $element, int $dept): string
        {
            $str = $this->element($element) . PHP_EOL;
            if (is_array($this->structure[$element]) && count($this->structure[$element]) > 0) {
                foreach ($this->structure[$element] as $id) {
                    $str .= $this->print($id, $dept + 1);
                }
            }
    
            return $str;
        }
    
        private function print(int $element, int $dept = 1): string
        {
            return '<ul><li>' . $this->printElement($element, $dept) . '</li></ul>' . PHP_EOL;
        }
    
        private function run(): string
        {
            return $this->print(current(current($this->structure)));
        }
    
        public function __toString(): string
        {
            return $this->run();
        }
    }
    
    echo(new Printer($cats, $structure));

    структура бд
    -- phpMyAdmin SQL Dump
    -- version 4.8.3
    -- https://www.phpmyadmin.net/
    --
    -- Хост: 127.0.0.1:3306
    -- Время создания: Фев 16 2019 г., 11:41
    -- Версия сервера: 8.0.12
    -- Версия PHP: 7.2.10
    
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
    SET time_zone = "+00:00";
    
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8mb4 */;
    
    --
    -- База данных: `test`
    --
    
    -- --------------------------------------------------------
    
    --
    -- Структура таблицы `products`
    --
    
    CREATE TABLE `products` (
      `id` int(11) NOT NULL,
      `name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
      `parent_id` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    
    --
    -- Дамп данных таблицы `products`
    --
    
    INSERT INTO `products` (`id`, `name`, `parent_id`) VALUES
    (1, 'Рыбалка', 0),
    (2, 'Удилища', 1),
    (4, 'Спининговые', 2),
    (5, 'Морские', 2),
    (6, 'Катушки', 1);
    
    --
    -- Индексы сохранённых таблиц
    --
    
    --
    -- Индексы таблицы `products`
    --
    ALTER TABLE `products`
      ADD PRIMARY KEY (`id`);
    
    --
    -- AUTO_INCREMENT для сохранённых таблиц
    --
    
    --
    -- AUTO_INCREMENT для таблицы `products`
    --
    ALTER TABLE `products`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;
    COMMIT;
    
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

    5c67cd0973e35415319613.png
    Ответ написан
    Комментировать
  • Как удалить из трех или более таблиц mysql по одному id?

    @rPman
    а left join?

    По уму правильный способ, при создании foreign key index нужно указать on delete cascade, и тогда при удалении записи в главной таблице, все связанные записи удалятся автоматически
    Ответ написан
    Комментировать
  • Как отсортировать данные после их первой сортировки?

    Подзапросы в помощь:

    SELECT * FROM (
        SELECT * FROM doctrine_migration_versions ORDER BY execution_time ASC LIMIT 3
    ) r ORDER BY r.execution_time DESC;
    Ответ написан
    2 комментария
  • Как найти полные дубликаты строк в MySQL таблице?

    coderisimo
    @coderisimo
    //f1, f2 - все поля  по которым ищем дубликаты
    SELECT f1, f2, COUNT( f1) AS cnt
    FROM table
    GROUP BY f1, f2
    HAVING (cnt > 1)
    Ответ написан
    2 комментария
  • Можно ли перезагрузить discord бота через терминал в vusial studio code? если можно как?

    Alexandre888
    @Alexandre888 Куратор тега Боты
    Javascript-разработчик
    CTRL + C в терминале.
    Ответ написан
    Комментировать
  • Как запустить сервер mysql?

    @DunkanMaklaut
    Студент
    Остановка и запуск сервера MySQL. Остановить и запустить сервис MySQL можно используя службы Windows: "Пуск" -> "Панель управления" -> "Администрирование" -> "Службы" и найдя в списке служб MySQL51 нажать на нее, после чего кнопками "Пуск" и "Стоп", можно, соответственно, запустить или остановить сервис MySQL.
    Ответ написан
    Комментировать
  • Как получить membera из уже написанного ботом эмбеда?

    Alexandre888
    @Alexandre888 Куратор тега Боты
    Javascript-разработчик
    let member = message.guild.members.cache.find(member => message.member.user.id == m.embeds[0].description.replace(/\D+/g,""));
    Ответ написан
    Комментировать
  • В чем проблема слэш команд?

    nowm
    @nowm
    У дискорда есть такая фишка, что на interaction нужно ответить в течение 3-х секунд. Если не успели, он начинает выдавать такую ошибку. Есть несколько вариантов:

    1. Сразу после того, как был получен interaction, нужно вызвать interaction.deferReply. Вызов deferReply даёт возможность продлить срок ответа до 15 минут. Дальше как обычно — делаете pool.query и потом interaction.reply
      await interaction.deferReply();
      // После вызова кода выше, дискорд даёт ещё 15 минут 
      // на то, чтобы отправить ответ.
      
      // [Тут какой-то ваш код, который долго работает]
      
      await interaction.reply('Информация о сервере: бла-блабла');


    2. Можно использовать механизм Follow-ups. В таком случае вы сразу что-нибудь отвечаете с помощью interaction.reply, потом делаете pool.query и потом добавляете ещё текст с помощью interaction.followUp:
      await interaction.reply('Ща, погодь, нужно в БД посмотреть...');
      // После вызова кода выше, дискорд даёт ещё 15 минут 
      // на то, чтобы отправить follow up.
      
      // [Тут какой-то ваш код, который долго работает]
      
      await interaction.followUp('Вот, нашёл: Информация о сервере: бла-блабла');
      // Код выше добавляет к ответу текст "Вот, нашёл: Информация о сервере: бла-блабла" 
      // (фраза «Ща, погодь» никуда не пропадает)


    3. Можно точно так же сразу ответить, но вместо interaction.followUp вызывать interaction.editReply. В этом случае даётся тоже 15 минут на то, чтобы вызвать editReply.
      await interaction.reply('Подождите...');
      // После вызова кода выше, дискорд даёт ещё 15 минут 
      // на то, чтобы отредактировать это сообщение
      
      // [Тут какой-то ваш код, который долго работает]
      
      await interaction.editReply('Информация о сервере: бла-блабла');
      // Код выше заменяет "Подождите.." на "Информация о сервере: бла-блабла"


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

    26DiDi12
    @26DiDi12
    Энтузиаст :3
    На решение мне потребовался часик, вот твой код переделанный мной:
    let talkedRecently = 0;
    let talkedRecentlyDAYS = 0;
    let talkedRecentlyHOURS = 0;
    let talkedRecentlyMINUTES = 0;
    let talkedRecentlySECUNDES = 0;
    
    if(message.content.startsWith(prefix + "day")) {
            if (talkedRecently > 0) {
                   message.channel.send(`Вы уже использовали эту команду. Повторите через ${Math.floor(talkedRecentlyDAYS)} дней / ${Math.floor(talkedRecentlyHOURS)} часов / ${Math.floor(talkedRecentlyMINUTES)} минут / ${talkedRecentlySECUNDES} секунд.`)
            } else {
                      message.channel.send("Успешно!")
                      talkedRecently = 86400000;
                      talkedRecentlyDAYS = talkedRecently/86400000;
                      let time = setInterval(() => {
                            if (talkedRecently <= 0) { clearInterval(time); return; }
                            talkedRecentlySECUNDES -= 1;
                            if (talkedRecentlySECUNDES < 0) { talkedRecentlySECUNDES = 59; talkedRecentlyMINUTES -= 1; }
                            if (talkedRecentlyMINUTES < 0) { talkedRecentlyMINUTES = 59; talkedRecentlyHOURS -= 1; }
                            if (talkedRecentlyHOURS < 0) { talkedRecentlyHOURS = 23; talkedRecentlyDAYS -= 1; }
                            talkedRecently -= 1000;
                      }, 1000);
            }
    }
    Ответ написан
  • Как составить запрос к MYSQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT UserID, t1.CountMessage-t2.CountMessage
    FROM daily_exp_snapshots t1
    JOIN daily_exp_snapshots t2 USING (UserID)
    WHERE t1.date_added >= CURRENT_DATE
      AND t1.date_added < CURRENT_DATE + INTERVAL 1 DAY
      AND t2.date_added >= CURRENT_DATE - INTERVAL 1 DAY
      AND t2.date_added < CURRENT_DATE
    Ответ написан
    Комментировать