Найти в Дзене
Поддержите автораПеревод на любую сумму
Внимательность с SQL - один запрос - а результаты разные
Есть два идентичных запроса. НО!!!! Они выдают разные результаты! Загадка для Вас: почему? SELECT n.* , c.name as name_category FROM news n LEFT JOIN news_category c on n.id_category = c.id_category WHERE true ORDER BY d_news DESC LIMIT 0 OFFSET 5 SELECT n.*, c.name FROM news n LEFT JOIN news_category c ON n...
1 месяц назад
DEFAULT как секретное оружие для оптимизации больших таблиц
Когда мы работаем с таблицами, содержащими миллионы и даже миллиарды записей, каждый байт на счету. В таких условиях хранение NULL-значений может становиться неожиданно дорогой операцией. Использование значения по умолчанию (DEFAULT) для замены NULL — это простая, но чрезвычайно эффективная стратегия. Чтобы понять преимущество DEFAULT, нужно разобраться, как PostgreSQL хранит данные и NULL-значения. Ключевой вывод: NULL — это не «отсутствие данных». Это специальный маркер, на хранение которого тратится место (1 бит на столбец + выравнивание)...
2 месяца назад
Правда ли, что запросы с LIMIT 1 выполняются быстрее?
Да, в большинстве случаев запросы с LIMIT 1 действительно выполняются быстрее, но есть важные нюансы. -- База останавливает поиск после первой найденной записи SELECT * FROM users WHERE email = 'test@example.com' LIMIT 1; -- Передается только одна запись вместо всех подходящих SELECT * FROM products WHERE category = 'electronics' LIMIT 1; -- Если есть индекс по created_at, запрос очень быстрый SELECT * FROM orders ORDER BY created_at DESC LIMIT 1; Когда LIMIT 1 НЕ помогает: -- Полное сканирование...
3 месяца назад
PHP Функции копирования папок "один в один"
Вот функция для копирования всех файлов из папки А в папку Б: function copyAllFiles($sourceDir, $destinationDir) { // Проверяем существование исходной папки if (!is_dir($sourceDir)) { throw new Exception("Исходная папка не существует: " . $sourceDir); } // Создаем целевую папку если не существует if (!is_dir($destinationDir)) { if (!mkdir($destinationDir, 0755, true)) { throw new Exception("Не удалось создать целевую папку: " . $destinationDir); } } // Получаем все файлы из исходной папки $files = array_diff(scandir($sourceDir), ['...
5 месяцев назад
PHP скрипт для создания дампов таблиц PostgreSQL с архивацией
Вот полный скрипт, который создает дампы всех таблиц указанной базы данных PostgreSQL в формате SQL (с INSERT-запросами), затем архивирует каждый дамп и удаляет исходный файл: <?php // Параметры подключения к PostgreSQL $db_host = 'localhost'; $db_port = '5432'; $db_name = 'ваша_база_данных'; $db_user = 'ваш_пользователь'; $db_pass = 'ваш_пароль'; // Директория для сохранения дампов $backup_dir = __DIR__ . '/pg_backups/'; if (!file_exists($backup_dir)) { mkdir($backup_dir, 0755, true); } // Подключение...
5 месяцев назад
PHP-скрипт для генерации sitemap.xml
PHP-скрипт для генерации sitemap.xml, который включает URL с параметрами ?act=* для локального сайта. Скрипт сканирует файлы в указанной директории и формирует валидный XML-файл. <?php // Конфигурация $siteUrl = 'http://localhost'; // Базовый URL вашего локального сайта $targetDir = __DIR__; // Директория для сканирования (текущая или укажите путь, например: '/path/to/your/site' $sitemapPath = __DIR__ . '/sitemap.xml'; // Куда сохранить sitemap.xml $includeQueryUrls = true; // Включать URL с параметрами...
6 месяцев назад
Поиск ключа по значению в массиве PHP
Для поиска ключа в массиве по его значению в PHP есть несколько способов. Рассмотрим пример с массивом a[1 => ['name_value']]. $array = [1 => ['name_value'], 2 => ['other_value']]; // Ищем ключ, где первый элемент подмассива равен 'name_value' $key = array_search('name_value', array_column($array, 0)); if ($key !== false) { echo "Найден ключ: " . ($key + 1); // Выведет: Найден ключ: 1 } else { echo "Значение не найдено"; } $array = [ 1 => ['name' => 'name_value'], 2 => ['name' => 'other_value']...
7 месяцев назад
Удаление дубликатов в PostgreSQL по ID (или по другому полю)
Вот несколько эффективных способов удалить дубликаты строк в таблице PostgreSQL, сохраняя только одну запись для каждого уникального ID: WITH duplicates AS ( SELECT id, ROW_NUMBER() OVER(PARTITION BY id ORDER BY ctid) AS row_num FROM your_table ) DELETE FROM your_table WHERE (id, ctid) IN ( SELECT id, ctid FROM duplicates WHERE row_num > 1 ); CREATE TABLE your_table_new AS SELECT DISTINCT ON (id) * FROM your_table ORDER BY id, some_timestamp_column; -- можно указать критерий для выбора какой дубликат...
7 месяцев назад
Как на PHP вписать текст в изображение заданной ширины
Вот решение на PHP для вписывания текста в изображение заданной ширины (200px) с переносами по словам и учетом размера шрифта Arial 10pt: Пример генерации картинки с текстом // Настройки $imageWidth = 200; $fontSize = 10; $fontFile = '/правильный путь к шрифту/arial.ttf'; // Укажите правильный путь к шрифту $text = "Вот решение на PHP для вписывания текста в изображение заданной ширины (200px) с переносами по словам и учетом размера шрифта Arial 10pt. Ваш длинный текст, который нужно вписать в изображение, с правильными переносами по словам и запятым...
7 месяцев назад
Копирование данных между таблицами в PostgreSQL
В PostgreSQL есть несколько способов копирования данных из одной таблицы в другую. Рассмотрим основные методы: sql INSERT INTO target_table SELECT * FROM source_table; INSERT INTO target_table (column1, column2, column3) SELECT column1, column2, column3 FROM source_table; INSERT INTO target_table SELECT * FROM source_table WHERE condition; CREATE TABLE new_table AS SELECT * FROM source_table; INSERT INTO schema1.target_table SELECT * FROM schema2.source_table; INSERT INTO target_table (id, name,...
7 месяцев назад
PG: Сортировка по самому позднему заполненному полю из двух (d_last_login и d_active)
Для сортировки по самому позднему значению между двумя полями даты, где одно или оба могут быть NULL, в PostgreSQL есть несколько эффективных способов: SELECT * FROM your_table ORDER BY GREATEST( COALESCE(d_last_login, '1970-01-01'::timestamp), COALESCE(d_active, '1970-01-01'::timestamp) ) DESC; SELECT * FROM your_table ORDER BY CASE WHEN d_last_login IS NOT NULL AND d_active IS NOT NULL THEN GREATEST(d_last_login, d_active) WHEN d_last_login IS NOT NULL THEN d_last_login WHEN d_active IS NOT NULL...
7 месяцев назад
PHP: Сравнение двух массивов на соответствие ключей и значений
В PHP есть несколько способов сравнить два массива на соответствие в зависимости от того, что именно нужно проверить: $array1 = [1, 2, 3]; $array2 = [2, 1, 3]; if (array_diff($array1, $array2) === [] && array_diff($array2, $array1) === []) { echo "Массивы содержат одинаковые значения"; } else { echo "Массивы разные"; } if ($array1 === $array2) { echo "Массивы полностью идентичны (значения, ключи, порядок и типы)"; } else { echo "Массивы разные"; } if (array_diff_assoc($array1, $array2) === [] &&...
7 месяцев назад