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

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    INSERT INTO my_table (login, host, event_id) 
    SELECT 'strelkov.av', 'home_pc', 1
    FROM my_table
    WHERE login='strelkov.av' 
    AND host='home_pc'
    AND event_id=1
    HAVING COUNT(*)=0;

    Обратите внимание, что значения login, host и event_id вам в 2х местах надо указывать. Работает это дело так - если конструкция SELECT ... HAVING COUNT(*)=0 вернет true (то есть SELECT не нашел записи с таким логином, хостом и ID ивента), то будет выполнен INSERT. Если же SELECT вернет false (COUNT не равен 0, значит такая строка уже существует), то INSERT будет проигнорирован целиком. Понимаю, что это не сразу вкуривается, но SQL штука интересная :)

    PS: Подразумевается, что id у вас AUTO_INCREMENT, а у date DEFAULT NOW() и их передавать вообще не надо.
    Ответ написан
  • Как создать определенный запрос?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Исходя из предположения, что это one-to-many, а даты - date вам нужен обычный JOIN и сравнение дат:

    SELECT * 
    FROM `products`
    JOIN `opportunities`
    ON `opportunities`.`product_id` = `products`.`id`
    WHERE `start_date` > '2019-07-01'
    AND `end_date` < '2019-08-01';
    Ответ написан
    Комментировать
  • Как написать запрос в базу wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Получить ID постов в конкретной категории:
    $args = array(
        'post_type' => 'post', // изолируем нужный post type
        'post_status' => 'publish', // изолируем только опубликованные записи
        'category__in' => array( 15 ), // где 15 - ID вашей категории
        'posts_per_page' => -1, // забираем все посты, отвечающие требованиям
        'fields' => 'ids', // возвращаем только массив ID найденных записей
        'cache_results' => true, // кешируем полученные результаты
        'no_found_rows' => true, // не считаем общее количество найденных записей
        'update_post_meta_cache' => false, // не забираем и не кешируем метаданные для этих записей
        'update_post_term_cache' => false, // не забираем и не кешируем термины для этих записей
    );
    $posts_in_category = new WP_Query( $args );

    Половина $args - это оптимизация и ускорение запроса. Получаем только необходимые данные, не запрашиваем, не обрабатываем и не кешируем то, что нам вообще не нужно. Задача - получить и закешировать только массив ID записей, которые имеют нужную категорию. Все это есть в документации.

    2. Получаем теги, которые используются данными постами (полученными выше):
    $args = array(
        'taxonomy' => 'post_tag', // изолируем нужную таксономию
        'object_ids' => $posts_in_category->posts, // получаем только теги, которые присвоеные объектам с этими ID
        'update_term_meta_cache' => false, // true|false - получать ли (и кешировать ли) метаданные терминов
    );
    $tags_in_posts = get_terms( $args );

    На выходе у вас будет массив тегов. Дополнительные параметры можете смотреть тут. Собственно, вместо get_terms() можете использовать WP_Term_Query.

    UPDATE:

    Допустил ошибку в коде, строчка 'object_ids' => $posts_in_category, должна быть 'object_ids' => $posts_in_category->posts, - ибо переменная будет содержать объект WP_Query, а уже свойство posts будет содержать ID найденных постов.

    Еще один важный нюанс и еще одна ошибка - если категорию включать с помощью параметра 'cat', то запрос по умолчанию будет выполнен с параметром 'include_children' => true, что нам не нужно, ибо исказит результат и включит ненужные посты. Переписал и этот фрагмент - вместо использования стандартного параметра 'cat' теперь используем 'category__in' - это включит только посты, которым назначена именно эта категория.

    Что касается количества выполненных запросов:

    WP_Query выполнит только 1 запрос:

    SELECT wp_posts.ID
    FROM wp_posts 
    LEFT JOIN wp_term_relationships
    ON (wp_posts.ID = wp_term_relationships.object_id)
    WHERE 1=1 
    AND ( wp_term_relationships.term_taxonomy_id IN (2) )
    AND wp_posts.post_type = 'post'
    AND ((wp_posts.post_status = 'publish'))
    GROUP BY wp_posts.ID
    ORDER BY wp_posts.post_date DESC


    В данном коде 2 = ID категории на моем тестовом сайте. На выходе получается Х постов, которым назначена именно эта категория.

    Далее, get_terms выполнит тоже всего 1 запрос:

    SELECT t.*, tt.*
    FROM wp_terms AS t 
    INNER JOIN wp_term_taxonomy AS tt
    ON t.term_id = tt.term_id
    INNER JOIN wp_term_relationships AS tr
    ON tr.term_taxonomy_id = tt.term_taxonomy_id
    WHERE tt.taxonomy IN ('post_tag')
    AND tr.object_id IN (19, 15, 13, 1)
    ORDER BY t.name ASC


    В данном коде 19, 15, 13, 1 - это и есть ID постов, которые мы получили первым запросом. Таким образом, будут получены только термины таксономии post_tag, которые назначены этим конкретным постам.
    Ответ написан
  • Где ошибка в SQL-запросе?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы про запятые забыли при перечислении колонок, которые надо обновить:
    UPDATE 
        vhosts_kp 
    SET 
        servname = 'yandex.com',
        alias = 'yandex.com www.yandex.com',
        email = 'dart@xxx.ru',
        indexfiles = '',
        charset = ''
    WHERE 
        userid = 'admin' AND 
        name = 'mysite';
    Ответ написан
    Комментировать
  • {Wordpress} Как после отправки формы, создать запись на основе заполненных данных?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Во-первых, зачем вы пишете полностью произвольную отправку, если у WordPress есть wp_mail()?
    Схема такая:
    1. Аяксом вы должны отправлять форму на admin-ajax.php (гуглите ajax in WordPress)
    2. У вас должен быть свой коллбек/обработчик на хуках wp_ajax_{action} и wp_ajax_nopriv_{action}
    3. В обработчике валидируете данные (нельзя же просто тулить $_POST['var'] без проверки)
    4. После валидации отправляете письмо с помощью wp_mail()
    5. И создаете новую запись с помощью wp_insert_post()
    6. После создания записи у вас есть ее ID, добавляете нужные метаданные через АПИ ACF
    7. Возвращаете что нужно в браузер
    Ответ написан
    1 комментарий
  • Как удалить/добавить пост в Wordpress и его метаданные с помощью SQL запроса?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    И зачем вам эти сложные запросы, сделайте простенький аякс-интерфейс и вызывайте удаление-добавление нативными методами по одному, а не все сразу.
    Ответ написан
  • Как правильно построить структуру бд для мультиязычных записей?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Архитектура мультиязычных данных - штука занимательная. Там есть варианты и нюансы. Почитайте для начала вот эту статью.
    Ответ написан
    Комментировать
  • Как оптимизировать вывод рекомендуемых к прочтению материалов?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы используете стандартные функции для доступа к постам в БД, включите кеширующий бекенд (Memcached, Redis) и все будет ок. Еще один вариант - использование Transients API для кеширования результата всех этих запросов сразу, например, на 1 день.
    Ответ написан
    Комментировать
  • Как блокировать удаление объявления и повторное его добавление?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Хранить удаленные сообщения в БД со статусом "deleted", перед добавлением нового объявления проверять на совпадения "deleted". Через определенное время можно/нужно собирать и выпиливать этот мусор из БД.
    Ответ написан
  • Как побороть sql инъекцию на joomla 2.5?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Перестать использовать Joomla 2.5 целиком либо тот модуль, в котором это происходит (если это не ядро системы).
    Ответ написан
    Комментировать
  • Есть ли бесплатный хостинг sql?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Да у любого адекватного хостера возьмите облачный VPS, тот же Digital Ocean. Подняли сервак, сделали что надо, грохнули. Заплатите по итогу пару копеек.
    Ответ написан
    Комментировать
  • Нармальный mysql

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    MariaDB - отличный вариант. Только, в любом случае - что с MariaDB, что с MySQL - надо попросту устанавливать именно то, что нужно, а не все подряд. Какая OS? Что мешает собрать отдельно только сервер?
    Ответ написан
    Комментировать